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

标签 c# windows-phone-7 random

我在随机列表方面遇到了很多问题。我说的是一个包含 200 个元素的列表,我想在其中洗牌。不要误会我的意思,我看了很多例子,乍一看有一些很不错的东西,像这样:

Randomize a List<T>

但根据我的经验,至少在快速机器上,这基本上是毫无值(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/

相关文章:

c# - 暂停程序以检查 C# 中的变量值

c# - 如何从 PopUp 窗口到达 ApplicationBar?

windows-phone-7 - 如何在 Windows Phone 7 系列上创建动态磁贴

java - 如何生成 2 个 1 到 7 之间的随机整数,且两者都不为 5?

c# - #Eval 短日期

c# - 按未选择的列排序

c# - 如何在 C# 5.0 应用程序中嵌入 lua(或其他脚本语言)

windows - 适用于 Windows Phone 的 XNA 游戏开发

go - 在自定义范围内生成随机数

c++ - 为什么我的 mt19937 随机生成器给我的结果很荒谬? C++