【发布时间】:2015-02-08 03:32:38
【问题描述】:
当我在 monodevelop IDE 中的 Mono(显然不是 Microsoft 的 C#)中运行以下代码时。我每次都得到相同的随机数序列(00111111110110001001)。如果我将范围更改为其他内容,例如r.Next(0, 5) 然后我得到随机值。这对我来说似乎很奇怪..这是一个错误还是我在做一些愚蠢的事情?
注意:有时这些数字似乎被否定了......例如我偶尔会看到 11000000001001110110。
using System;
namespace TestRNG
{
class MainClass
{
public static void Main (string[] args)
{
Random r = new Random ();
for (int i = 0; i < 20; i++) {
Console.Write(r.Next(0, 2));
}
Console.WriteLine();
}
}
}
这不是“在 Random 实例上调用 Next() 调用过于紧密,因此使用来自系统时钟问题的相同种子作为种子”。
使用以下代码:
using System;
namespace TestRNG
{
class MainClass
{
public static void Main (string[] args)
{
Random r = new Random (Guid.NewGuid().ToByteArray()[0]);
for (int i = 0; i < 20; i++) {
int rn = r.Next ();
Console.WriteLine(rn + " " + (rn % 2));
}
Console.WriteLine();
}
}
}
我看到我每次都得到不同的 rn 值,但我怀疑 r.Next() 返回的 rn % 2 的值序列与我经常看到的旧值相同。这让我相信俄罗斯?之前发布答案并被否决的人是正确的(他随后删除了他的答案)。例如,请参阅http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx。
基于下面的其中一个 cmets,这可能只是一个单声道实现的东西。
【问题讨论】:
-
在 Windows 上运行它会产生不同的零和一序列。
-
每次都会这样吗? (即,您每次跑步时它们是否不同?)。您是使用单声道还是 C# 运行。在单声道中可能是一个糟糕的 RNG 实现?
-
不,我们的俄罗斯朋友错了。当您取模 2 时,该序列显然不是随机的。换句话说,
r.Next()为您提供了一个随机的位序列,除了最后一位 - 最后一位始终是可预测的。这似乎是一个单声道实现问题,并且代码在 Windows 中很好。 -
我已将其从 C# 重新标记为 mono 并修复了标题,因此我不会混淆 C# 的人。我还向 mono 发布了错误报告。我认为我们的俄罗斯朋友的观点是生成的随机数的低位缺乏随机性。我怀疑这可能是这里的原因。实际上,如果我们的俄罗斯朋友使用模数,您可能是对的,但这无济于事(我不记得他的名字或他发布的确切文字)。右移似乎确实有帮助。
-
您应该重新添加 [c#] 标签 - 只是因为它是 [mono] 并不意味着它不是 [c#]。 [mono]只是CLR的linux实现,其中包括[c#]。