为什么Random.Next()总是返回相同的数字

考虑这种方法:

private static int GenerateRandomNumber(int seed, int max) { return new Random(seed).Next(max); } 

在我的机器上,执行此循环会产生相同数量的1500次迭代:

  for (int i = 0; i < 1501; i++) { int random = GenerateRandomNumber(100000000, 999999999); Console.WriteLine(random.ToString()); Console.ReadKey(); } 

每次迭代我得到145156561。

我没有一个紧迫的问题,我只是对这种行为感到好奇,因为.Next(max)说“返回一个非负的随机数小于指定的最大值。也许我不理解一些基本的东西。

你总是用相同的种子播种一个新实例,然后抓住第一个最大值。 通过使用种子,您可以保证相同的结果。

如果你想要一个产生不同结果的静态随机数生成,你应该重做一下。 但是,由于Random不是线程安全的,因此静态使用时需要一些同步。 就像是:

 private static Random random; private static object syncObj = new object(); private static void InitRandomNumber(int seed) { random = new Random(seed); } private static int GenerateRandomNumber(int max) { lock(syncObj) { if (random == null) random = new Random(); // Or exception... return random.Next(max); } } 

迪尔伯特在2001年遇到了同样的问题:

http://dilbert.com/strips/comic/2001-10-25/

巧合?

我不这么认为。

random.org同意: http ://www.random.org/analysis/

问题是您每次都使用相同的种子编号创建一个新的Random实例。 您应该创建一个Random实例(如果需要,将其存储在静态中)并简单地在同一实例上调用next方法。

随机数生成并非真正随机,请参阅此Wikipedia条目以获取更多详细信息。

伪随机数发生器通常通过选择种子,然后基于该种子生成确定性序列来工作。 每次选择相同的种子,您生成相同的序列。

.NET中只有“^ 2”个不同的随机序列。

不确定内部是如何工作的。检查维基,但它很简单。

 public class MathCalculations { private Random rnd = new Random(); public Int32 getRandom(Int32 iMin, Int32 iMax) { return rnd.Next(iMin, iMax); } } public class Main { MathCalculations mathCalculations = new MathCalculations(); for (int i = 0; i < 6; i++) { getRandom(0,1000); } } 

将生成Number1,Number2,Number3,Number4,Number5,Number6(1个种子,1个序列中的多个数字,随机*不是真的,但是大约*)

如果你这样做:

 public class MathCalculations { public Int32 getRandom(Int32 iMin, Int32 iMax) { Random rnd = new Random(); return rnd.Next(iMin, iMax); } } public class Main { MathCalculations mathCalculations = new MathCalculations(); for (int i = 0; i < 6; i++) { getRandom(0,1000); } } 

您现在将获得Number1,Number1,Number1,Number1,Number1,Number1(1个种子,6个相等的多个序列,始终从每个相等的序列中选择相同的起始编号)。在某些时候,Number1将是不同的,因为种子随着时间的推移而改变..但是你需要等待一段时间,但是,你永远不会从序列中选择number2。

原因是,每次生成具有相同种子的新序列时,因此序列一遍又一遍地相同,并且每次随机生成将选择其序列中的第一个数字,该序列使用相同的种子,当然总是一样的。

不确定随机生成器的基础方法在技术上是否正确,但这就是它的行为方式。

萨拉姆对所有人来说,它也让我疯狂。 答案很简单。 在生成随机数之前更改种子。

示例:我想生成1到10之间的随机数

 Random rnd = new Random(DateTime.Now.Seconds); int random_number = rnd.Next(10); 

把它放在一个循环中并运行三次。 它会给出低于10的随机数。

如果有人正在寻找“快速而肮脏”的“解决方案”(我谨慎使用该术语)那么这对大多数人来说就足够了。

 int secondsSinceMidnight = Convert.ToInt32(DateTime.Now.Subtract(DateTime.Today).TotalSeconds); Random rand = new Random(secondsSinceMidnight); var usuallyRandomId = rand.Next(); 

请注意我的使用通常是随机的。 我同意标记为答案的项目是更正确的方法。