C#随机代码 - 大部分都是错误的吗?

Chr*_*ert 4 c# random windows-phone-7

随机化列表我遇到了很多问题.我在谈论一个包含200个元素的列表,我希望将其列入清单.不要误会我的意思,我读了很多例子,乍一看有很好的东西,比如:

随机化List <T>

但根据我的经验,至少在快速机器上,这基本上是毫无价值的.改组运行得如此之快,以至于两次调用Random.NEXT()之间没有MS延迟,导致几乎不随机的行为.

我不是在谈论超级安全的东西,只是随机的基本游戏.我知道我可以添加1 MS的延迟,但这意味着"浪费"200 MS只是随机化一个列表.

现在我找到了这种方法:http://www.codinghorror.com/blog/2007/12/shuffling.html

看起来不错,使用GUID进行排序.但他们不是以同样的方式创造的吗?让我们提高一个档次,让我们假设我要创建1000个数字,介于0 - 5之间.这段代码基本没用:

        var resultA = new List<int>();
        for (int i = 0; i < 1000; i++)
        {
            resultA.Add(new Random().Next(5));
        }


        var resultB = new List<int>();
        for (int i = 0; i < 1000; i++)
        {
            resultB.Add(new Random().Next(5));
            Thread.Sleep(1);
        }
Run Code Online (Sandbox Code Playgroud)

A根本不起作用,至少不是我在Windows Phone 7中的环境.B很好,但它需要一秒钟,这也是愚蠢的.任何评论或想法,创建随机的整数列表都不是那么难:-)

Mar*_*off 22

不要一直初始化一个新的实例Random; 只做一个并不断引用它.

var random = new Random();
var resultA = new List<int>();
for (int i = 0; i < 1000; i++)
{
    resultA.Add(random.Next(5));
}
Run Code Online (Sandbox Code Playgroud)

你是正确的,Random在同一个"时间戳"内重复创建新实例将导致相同的种子; 但是调用.NextRandom的实例会"提升"种子,以便您检索的下一个数字(很可能)不同.

随机文档中也包含这一点:

...因为时钟具有有限的分辨率,使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列.

...

通过创建单个Random对象而不是多个Random对象可以避免此问题.


Bro*_*ski 6

你需要保持相同的Random实例.

    var random = new Random();

    var resultA = new List<int>();
    for (int i = 0; i < 1000; i++)
    {
        resultA.Add(random.Next(5));
    }


    var resultB = new List<int>();
    for (int i = 0; i < 1000; i++)
    {
        resultB.Add(random.Next(5));
        Thread.Sleep(1);
    }
Run Code Online (Sandbox Code Playgroud)

这是因为当Random初始化时,它使用系统时钟来获得一个时间点.当您拨打下一个电话时,它可以使用时间差来获得下一个号码.如果你继续初始化一个Random对象,你将在大多数时间内保持相同的数字.