gpt4 book ai didi

c# - 有效地生成随机数

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:18 24 4
gpt4 key购买 nike

如何有效地生成随机数?
每次启动随机数程序时,它都会开始吐出与以前相同的数字。 (我猜是因为随机数生成的准性质)
有没有办法让随机生成变得不确定?某种熵添加到启动后生成的数字与上一个顺序不同的生成。 (随机而不是准随机)
另外,假设这种生成的范围是 (m,n),使得 n-m = x,是否有可能在生成 x-1 个其他数字后,下一次出现一个数字“p”。但是下一批这样的 x 数字将与上一个的序列不同。示例:
范围:1,5。生成:2,4,5,1,3(第 1)4,2,3,1,5(第 2)... 相同的数字。
我出于不知所措的心态写下了这个:

int num1 = (rand.Next(1, 440) *31* (int)DateTime.Now.Ticks *59* (DateTime.Now.Second * 100) % 439) + 1;
int num2 = (rand.Next(1, 440) *31* (int)DateTime.Now.Ticks *59* (DateTime.Now.Second * 100) % 439) + 1;

这里的范围是 (1,440)。但它仍然会生成超出范围的数字和零,而且它的频率也不是那么好。它是 C#.NET 代码。为什么这样?
您的答案可以与语言无关/算法/分析。提前致谢。

最佳答案

很少有“随机”数生成器实际上是随机的。几乎所有都是伪随机的,当以相同的 seed value 开始时遵循可预测的序列.许多pseudorandom number generators (PRNG) 从其初始调用的日期和时间获取种子。其他人从操作系统提供的随机数据源获取种子,这些数据通常是从外部源(例如,鼠标移动、键盘事件)生成的。

为一个好的随机数生成器播种的正确方法是不播种。每个好的生成器都有一个默认机制来提供种子,而且它通常比你能想出的任何一个都要好得多。为生成器设置种子的唯一真正原因是您是否确实想要相同的随机数序列(例如,当您尝试重复需要随机性的过程时)。

参见 http://msdn.microsoft.com/en-us/library/system.random.aspx有关 C# Random 类的详细信息,但基本上,它使用一种非常知名且受人尊敬的算法,并使用日期和时间作为种子。

要回答您的关键问题,只需使用 rand.Next(min, max+1) 并且您将总是得到一个介于 之间的随机数字序列包括 minmax。每次使用相同的种子时,序列都是相同的。但是 rand = new Random() 将使用当前时间,并且只要您的程序在时间上以某种间隔调用,它们就会不同。

关于c# - 有效地生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com