当我在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();
}
}
}
这不是“调用Next()对Random的实例调用过于紧密,因此从系统时钟问题播种相同的种子”。
使用以下代码:
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的不同值,但是rn%2的值序列,这是我怀疑r.Next()返回的值,与我总是看到的旧值相同。这让我相信俄罗斯人?之前发布了一个答案并被拒绝投票给遗忘的人是正确的(他随后删除了他的答案)。例如,请参阅http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx。
根据下面的评论之一,这可能只是单声道实现。
答案 0 :(得分:0)
嗯,延伸到swistak说的话(因为我也使用了Guid类),这是我为你的问题制作的代码,已经过测试并且有效:
using System;
using System.Linq;
namespace pruebaDeNumerosAleatorios
{
class MainClass
{
public static int RandomNumber()
{
Random x = new Random(Guid.NewGuid().ToByteArray().First());
return x.Next(0, 20);
}
public static void Main(string[] args)
{
for (int i = 0; i < 20; i++)
Console.WriteLine(RandomNumber());
}
}
}
如前所述,您不会给内部时钟(您用作种子)的时间在迭代之间进行更改,因此生成的数字是相同的。我在这里做的是实现Guid类,它生成一个'唯一'数字,将其转换为字节数组,并使用数组的第一个元素作为种子。 我在一个方法中这样做是因为这样可以保证每次调用该方法时,Guid类会生成一个不同的数字,所以我使用不同的种子作为随机数。
答案 1 :(得分:-3)
您可以生成&#34;更随机&#34;使用Guid
类:
Random r = new Random(Guid.NewGuid().ToByteArray()[0]);
编辑:每次获得类似值的问题是因为Random.Next()
从当前系统时钟获取值,所以可能每次编译之间在生成不同值时没有太大的时间差异。尝试在循环中运行代码,值应该更加多样化。