7

現在のクロックティックを乱数生成のシードとして使用しています。乱数は疑似 GUID で使用され、データベースをチェックすると、戻る前に乱数がまだ存在しないことが確認されます。平均して、このメソッドはプロセスの存続期間中に約 10,000 回連続して呼び出されます。

私の懸念は、同じ番号が連続して生成され、同じ ID をチェックするデータベースへの複数の不要な再帰呼び出しが発生する可能性があることです。できればこれは避けたいです。このシナリオをテストする最善の方法は何ですか?

問題があれば、アプリケーションは .NET 4、データベースは SQL Server 2008 です。

private static string GenerateUniqueDelId()
{
    // Generate a random integer using the current number of clock ticks as seed.
    // Then prefix number with "DEL" and date, finally padding random integer with leading zeros for a fixed 25-character total length.
    int seed = (int)DateTime.Now.Ticks;
    Random number = new Random(seed);
    string id = string.Format("DEL{0}{1}", DateTime.Today.ToString("yyyyMMdd"), number.Next().ToString("D14"));

    // Lookup record with generated ID in Sesame. If one exists, call method recursively.
    string query = "SELECT * FROM Lead WHERE Esm_Id = @Esm_Id";
    SqlParameter[] parameters = { new SqlParameter("@Esm_Id", id) };
    if (DataManager.GetRow(query, parameters, DelConnection.Sesame) != null) return GenerateUniqueDelId();

    // Otherwise, return ID.
    return id;
}   //// End GenerateUniqueDelId()
4

2 に答える 2

13

あなたの懸念は正しいです。Randomインスタンスの作成をメソッド本体の外に移動する必要があります。そうしないと、同じ値を何度も再シードして、同じ番号シーケンスになります。

また、車輪を再発明していますRandom。クラスのデフォルトのコンストラクターは、現在のクロック時間をデフォルトのシードとして既に使用しています。

問題は、これらすべてを回避して、データベース側で自動生成された Guid を使用しないのはなぜですか?

于 2012-06-05T19:28:02.367 に答える
7

ジョン・スキートの引用

Stack Overflow の質問のタイトルに「ランダム」という単語が表示された場合、それが無数の同様の質問と同じ根本的な問題であることはほぼ間違いありません。この記事では、ランダム性が非常に多くの問題を引き起こす理由と、それらに対処する方法を見ていきます。

乱数発生器に関する彼の記事をチェックしてください

http://csharpindepth.com/Articles/Chapter12/Random.aspx

基本的に彼の解決策は次のようになります。

using System;
using System.Threading;

public static class RandomProvider
{    
    private static int seed = Environment.TickCount;

    private static ThreadLocal<Random> randomWrapper = new ThreadLocal<Random>(() =>
        new Random(Interlocked.Increment(ref seed))
    );

    public static Random GetThreadRandom()
    {
        return randomWrapper.Value;
    }
}
于 2012-06-05T19:32:40.473 に答える