Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言生成完全随机偶数#_C#_Winforms_Random_Numbers - Fatal编程技术网

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。。我不确定,但那不是我所说的“随机”

有什么好方法可以用C#生成随机偶数吗?我想出了这个密码:

    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