我在随机列表方面遇到了很多问题。我说的是一个包含 200 个元素的列表,我想在其中洗牌。不要误会我的意思,我看了很多例子,乍一看有一些很不错的东西,像这样:
但根据我的经验,至少在快速机器上,这基本上是毫无值(value)的。洗牌速度如此之快,以至于两次调用 Random.NEXT() 之间没有 MS 延迟,这导致几乎没有随机行为。
我不是在谈论 super 安全的东西,只是一个基本的随机游戏。我知道我可以添加 1 毫秒的延迟,但这意味着“浪费”200 毫秒只是为了随机化一个列表。
现在我找到了这个方法:http://www.codinghorror.com/blog/2007/12/shuffling.html
看起来不错,用GUIDs来排序。但是它们不是以相同的方式创建的吗?让我们更上一层楼,假设我想创建 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);
}
A根本不行,至少在我的Windows Phone 7环境下不行。B还好,就是要一秒,也是傻逼。任何评论或想法,创建随机整数列表并不难 :-)
最佳答案
不要继续初始化Random
的新实例;只做一个并不断引用它。
var random = new Random();
var resultA = new List<int>();
for (int i = 0; i < 1000; i++)
{
resultA.Add(random.Next(5));
}
您是正确的,在相同的“时间戳”内重复创建 Random
的新实例将产生相同的种子;但是在 Random 的实例上调用 .Next
会“推进”种子,以便您检索的下一个数字(很可能)不同。
这也包含在 the documentation on Random 中:
... because the clock has finite resolution, using the parameterless constructor to create different Random objects in close succession creates random number generators that produce identical sequences of random numbers.
...
This problem can be avoided by creating a single Random object rather than multiple ones.
关于C# 随机代码 - 大部分都是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347998/