使用时钟滴答为随机数种子(Using clock ticks as random number se

2019-06-25 05:54发布

我使用的是当前时钟滴答作为随机数生成的种子。 随机数是伪GUID使用,并在我的数据库检查将确保它不返回之前存在。 平均而言,这个方法会被周围陆续10K次过程的生命周期中调用。

我担心的是,相同的数字可能会产生背靠背导致多个不必要的递归调用我的数据库检查相同的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()

Answer 1:

你是对你的关心:你应该将你的创作Random比如你的方法体-使用相同的值多次导致相同数量的顺序,否则你将重新播种。

另外你还挺重新发明轮子:在默认的构造函数Random类已经使用当前时钟时间为默认种子。

问题是,你为什么不避免这一切,只使用一个自动生成的GUID在数据库方面?



Answer 2:

引用乔恩斯基特

当你在堆栈溢出问题的标题看到“随机”你几乎可以保证这将是无数类似的问题同样的根本问题。 本文将看看为什么随机性引起这么多的问题,以及如何解决这些问题。

检查他对随机数生成器的文章

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;
    }
}


文章来源: Using clock ticks as random number seed