使用C#生成随机偶数数字有什么好方法吗?我想出了这段代码:
Random RandString = new Random(0);
代码:
private void button6_Click(object sender, EventArgs e)
{
int min = 0;
int max = 50;
int rand = RandString.Next(min, max-1);
while (rand % 2 == 1) // odd
{
rand = RandString.Next(min, max-1);
}
textBox4.Text = "" + rand;
}
此代码出现问题:
那么有什么方法可以解决我所描述的问题,还是有其他方法?
答案 0 :(得分:8)
textBox4.Text = (2 * rand.Next(min / 2, max / 2)).ToString();
答案 1 :(得分:2)
更容易将你的结果乘以2
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();
}
答案 2 :(得分:2)
Random random = new Random();
int nextnum = random.Next(min/2,max/2) * 2
答案 3 :(得分:1)
您可以使用RNGCryptoServiceProvider获得“更随机”(这是我承认的一个愚蠢的术语)数字。在MSDN的文档页面上有一个很好的例子。
正如其他人推荐的那样,您可以将结果乘以2得到偶数。
答案 4 :(得分:1)
您的方法存在许多缺陷。
首先,来自.NET的Random
在加密意义AFAIK中并不是完全随机的,但它应该比您报告的结果好得多。最有可能的是,您在循环的每次迭代中都创建了一个新的Random
对象;因为当前的系统时间用于为RNG播种,所以如果你经常跑得非常短,你会得到相同的伪随机数序列。相反,在启动时创建一个Random
实例,并尽可能长时间保持它。
然后,从随机整数创建偶数比循环容易得多,直到找到恰好是偶数的偶数:只生成一个随机数并清除最低有效位:myRand.Next(min, max-1) & ~1;
。一个不错的RNG在其所有位上具有均匀分布,因此清除任何位不应该将熵减少超过一位。
回到'完全随机'部分:Random
提供伪随机数生成器。它基于一个有点随机的值(当前系统时间的最不重要部分)播种一次,但是给定相同的种子,RNG将在每次运行时可靠且确定地产生相同的数字。如果你想要真正的随机性(a.k.a。'entropy'),你会惊讶于在为确定性计算而构建的机器上生成它是多么困难。 UNIX和类Unix系统通常通过特殊的内核生成文件(/dev/random
)提供一个熵池,使用硬盘访问时序,网络噪声以及他们可以找到的任何其他实际随机源,以及使用相当复杂的计算将它们分馏成均匀分布。 Windows也许可以这样做,但我不知道.NET或经典win32 API中的任何API。