using System;
using System.Linq;
namespace Loto
{
class Program
{
static void Main(string[] args)
{
short[] tirage = new short[6]; //array that contains the numbers
short nbTirage; //the number randomed
for (int i = 0; i < 6; i++)
{
nbTirage = NombreAleatoire();
while (tirage.Contains(nbTirage)) //if the number has already been drawn
{
nbTirage = NombreAleatoire(); //we random another one
}
Console.Write(nbTirage + " "); //writing the result
}
}
static short NombreAleatoire()
{
Random nb = new Random();
return (short)nb.Next(1, 49);
}
}
}
这是完整的计划。
应该在1到49之间绘制7个唯一数字。该程序在调试模式下运行良好,但是当我从exe运行它时,它会绘制相同数量的7倍。是什么造成的?我正在使用Visual Studio。
答案 0 :(得分:5)
快速连续创建一个新的Random
对象会为该对象的每个实例提供相同的(基于时间的)种子,因此它们都将生成相同的数字。
使用Random
的单个实例生成正在进行的数字。像这样:
Random nb = new Random();
for (int i = 0; i < 6; i++)
{
nbTirage = (short)nb.Next(1, 49);
while (tirage.Contains(nbTirage)) //if the number has already been drawn
{
nbTirage = (short)nb.Next(1, 49); //we random another one
}
Console.Write(nbTirage + " "); //writing the result
}
(注意:你做在调试模式下遇到同样的行为,如果你没有暂停执行代码。Random
的种子是因此,通过暂停执行代码,您可以节省时间,从而更改种子。删除所有断点并让应用程序在调试模式下完全执行,您将看到在发布模式下看到的相同行为。)
答案 1 :(得分:2)
这是因为Random
的默认种子是你每次迭代播种时的时间。您需要传入Random
对象以确保获得不同的数字。
它正在调试步骤中,因为迭代之间的时间要慢得多,所以种子正在改变。
Random nb = new Random();
for (int i = 0; i < 6; i++)
{
nbTirage = NombreAleatoire(nb);
while (tirage.Contains(nbTirage)) //if the number has already been drawn
{
nbTirage = NombreAleatoire(nb); //we random another one
}
Console.Write(nbTirage + " "); //writing the result
}
static short NombreAleatoire(Random nb)
{
return (short)nb.Next(1, 49);
}