ASP.NET MVC C#随机生成相同数字

6

如何生成不同的数字,目前每次生成的都一样

Random rand = new Random(100000);
rand.Next();
5个回答

13

只需在构造函数中移除种子数即可。这个种子数本质上是生成随机数列表的一个数字。如果您指定一个固定的数字,那么您的随机数列表将始终相同。

Random rand = new Random();
rand.Next();

它会限制生成的字符数量吗?还是可以生成10000或1000000000个字符? - maztt
我认为生成数字的数量没有限制。这也与字符数量无关,因为“.Next()”方法返回一个大于等于零且小于MaxValue的32位有符号整数。 - Pierre-Alain Vigeant

8
您可以尝试使用相同的种子来指定,具体操作如下。
Random rand = new Random();
rand.Next();

这将使用默认种子,即时间。

"使用一个基于时间的默认种子值,初始化 Random 类的新实例。"

根据 MSDN:http://msdn.microsoft.com/zh-cn/library/system.random.aspx

针对您上面的评论,如何生成在一定范围内的“随机”数。

// Generate and display 5 random integers from 50 to 100.
Console.WriteLine("Five random integers between 50 and 100:");
Console.Write("{0,8:N0}", rand.Next(50, 101));

(摘自上面的MSDN链接)您现在可以生成所需的任何范围。


使用默认的基于时间的种子存在潜在问题。对于在多核处理器上运行的多线程应用程序,两个不同的线程生成完全相同的随机值变得相对可能(因为它们可以抓取完全相同的系统时间,从而产生相同的值)。我会使用Guid.NewGuid()的哈希作为种子。 - MusiGenesis
如果您正在开发这样的应用程序,那么是正确的,但是 Random() 类的使用不应该用于除了使事物看起来随机之外的任何其他目的。 - LiamB
该问题被标记为“asp.net”,这正是可能产生此类问题的多线程环境。两个用户同时访问同一段代码可能会看到相同的“随机”值。 - LukeH
返回翻译后的文本:如果提到了 rand.Next(Min, max); 就加1分。本来想放一个答案并加上这一点。强调101以生成50至100。 - WernerCD
@LukeH - 我不同意也不反对。这只是不是他所问的 :) - LiamB

4

不确定您想要什么!

(这段文字已经是中文了,无需翻译)
Random rand = new Random(Environment.TickCount);
rand.Next();

+1 当tickcount不是一个很好的种子时,它至少是动态的,并且对于一般目的来说可能足够好。 - Chris Marisic
将来,如果你不确定对方想要什么,最好不要试图回答问题。 - DOK
好的,谢谢。看起来我和其他人一样做出了同样的假设 :) - WraithNath
2
默认的 Random 构造函数已经使用了 Environment.TickCount。没有必要显式地指定它。 - LukeH
@LukeH - 谢谢,我只是认为这是一种公平指定种子的方式,不知道它实际上会使用它! - WraithNath

3
Random rand = new Random();
rand.Next(0,1000); // minimum = 0, maximum = 999

7
值得一提的是,最小值是包含在内的,而最大值是不包含在内的。上述将生成一个在(包括)0-999范围内的数字。 - Iain Galloway

3
Random rand=new Random(DateTime.Now.Millisecond);
rand.Next();

这对我总是有效。


1
为什么不直接使用 new Random(),因为它默认使用 Environment.TickCount 作为种子呢? - LukeH
@LukeH:你有关于这个的文档吗?我所看到的所有文档都是使用基于时间的值进行种子生成,这并不一定意味着它正在使用 Environment.TickCount - MusiGenesis
@MusiGenesis:我认为这是一种实现细节而不是指定的保证,但你可以使用ILDASM或Reflector来确认它。或者像这样做var r1 = new Random(); var r2 = new Random(Environment.TickCount); while (true) Console.WriteLine(r1.Next() == r2.Next());应该连续显示“true”,除非你真的很不幸,两个构造函数在一个tick的两侧运行。 - LukeH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接