C# 用C语言生成完全随机偶数#
有什么好方法可以用C#生成随机偶数吗?我想出了这个密码:C# 用C语言生成完全随机偶数#,c#,winforms,random,numbers,C#,Winforms,Random,Numbers,有什么好方法可以用C#生成随机偶数吗?我想出了这个密码: Random RandString = new Random(0); 代码: 此代码的问题: Random RandString = new Random(0); 我目前的解决方案可能不是最快的 通常,通过这种方法生成的数字会以相同的顺序重复!例如,经过5次迭代后,我可以得到:8、10、20、30、16。再次点击(大约15秒)后,我可以获得连续10、30、20或30、20、10。。我不确定,但那不是我所说的“随机”
Random RandString = new Random(0);
代码:
此代码的问题:
Random RandString = new Random(0);
- 我目前的解决方案可能不是最快的
- 通常,通过这种方法生成的数字会以相同的顺序重复!例如,经过5次迭代后,我可以得到:8、10、20、30、16。再次点击(大约15秒)后,我可以获得连续10、30、20或30、20、10。。我不确定,但那不是我所说的“随机”
那么,有什么方法可以解决我所描述的问题,或者有其他方法吗?更简单的方法是将结果乘以2
textBox4.Text = (2 * rand.Next(min / 2, max / 2)).ToString();
private void button6_Click(object sender, EventArgs e)
{
int min = 0;
int max = 25;
int rand = RandString.Next(min, max-1)*2;
textBox4.Text = rand.ToString();
}
你可以用这个来得到一个“更随机”(我承认这是一个愚蠢的术语)的数字。MSDN的文档页面上有一个很好的示例
正如其他人所建议的,你可以将结果乘以2得到一个偶数。你的方法有很多缺陷 首先,
Random
from.NET在加密意义上不是完全随机的,但它应该比您报告的结果要好得多。最有可能的是,在循环的每次迭代中,您都在创建一个新的随机对象;由于当前系统时间用于RNG的种子,因此,如果一个接一个运行很短,则将获得相同的伪随机数序列。相反,在启动时创建一个Random
实例,并尽可能长时间地保留它
然后,从一个随机整数创建偶数要比循环容易得多,直到找到一个偶数:只需生成一个随机数并清除最低有效位:myRand.Next(min,max-1)&~1代码>。一个好的RNG在它的所有比特上都有一个均匀的分布,所以清除任何比特都不应该减少超过一比特的熵
回到“完全随机”部分:random
提供了一个伪随机数生成器。它被设定一次种子,基于一个有点随机的值(当前系统时间的最低有效部分),但给定相同的种子,RNG将在每次运行时可靠地、决定性地产生相同的数字。如果你想要真正的随机性(又称“熵”),你会惊讶地发现,在为确定性计算而建造的机器上产生随机性是多么困难。UNIX和类UNIX系统通常通过一个特殊的内核生成的文件(/dev/random
)提供一个熵池,使用硬盘访问时间、网络噪声和他们能找到的任何其他实际随机性源,并使用相当复杂的计算将其提取成均匀分布。Windows可能也可以这样做,但我不知道在.NET或经典win32 API中有任何用于此的API。完全随机?我认为没有人知道如何产生普罗旺斯随机序列,只有伪随机序列可以重复。它仍然是随机的。通过排除以前看到的值,你肯定不是随机的。你应该命名你的控件。从一个非常好的普通随机数开始,然后乘以2。两倍随机!:-)它可以重复!当然但同样的三个数字在15-20个数字之后重复的概率是多少??这就是我吃的!而且它不是“随机的”-它是“重复的”,在100k的迭代之后,您的解决方案的速度是原来的两倍!唯一值得一提的是你不需要减去1。例如,要获得区间[0-988]中的值,我需要将“min”设置为0,“max”设置为1k。如果您想获得[0-1000],则“最大值”应设置为1001。
Random random = new Random();
int nextnum = random.Next(min/2,max/2) * 2