C#中的非重复随机数

时间:2013-12-07 14:48:59

标签: c# asp.net random

我正在尝试创建1到10之间的一系列非重复随机数,我计划通过将每个随机数存储到数组中然后每次检查该数组以确保我不是已经使用了这个号码。

我的问题是,不是创建不同的随机数,例如1,2,3,我只是一遍又一遍地得到相同的随机数。

        randomNumber();
        Label1.Text = randomRow + "";
        randomNumber();
        Label2.Text = randomRow + "";
        randomNumber();
        Label3.Text = randomRow + "";

        public int randomNumber()
        {
        List<int> numbers = new List<int>();
        int num = 0;
        Random randNum = new Random();
        num = randNum.Next(1, 11);

        if (numbers.Contains(num))
        {
            num = randNum.Next(1, 11);
        }
        else
        {
            randomRow = num;
            numbers.Add(num);
        }

        return randomRow;
    }

2 个答案:

答案 0 :(得分:3)

每次在太近的时间内创建RandomNumber对象时,

问题:

创建Random对象时,会使用系统时钟中的值播种。如果您创建的Random实例距离太近,它们将全部使用相同的随机序列播种。

来自Here

  

当你创建一个Random对象时,它的种子来自于   系统时钟。如果您创建的Random实例距离太近,则会出现   将全部播种相同的随机序列。

解决方案:

Random randNum = new Random();移到函数randomNumber()之外。

试试这个:

Random randNum = new Random();
public int randomNumber()
    {
    List<int> numbers = new List<int>();
    int num = 0;

    num = randNum.Next(1, 11);

    if (numbers.Contains(num))
    {
        num = randNum.Next(1, 11);
    }
    else
    {
        randomRow = num;
        numbers.Add(num);
    }

    return randomRow;
}

答案 1 :(得分:0)

我最好的猜测是你在循环中使用它。在这种情况下,因为你声明了

Random randNum = new Random();

evry time这将生成相同的数字。只需在循环之前声明它就可以了。

另外你应该考虑一个不同的approch,因为这不是一个好习惯。像:

    int[] array = {1,2,3,4,5,6,7,8,9,10};
    Random randNum = new Random();
    int rand=0;
    int temp;
    for(int i = 0; i<10;i++)
    {
         rand = randNum.next(1,10-i);
         temp=array[rand];
         array[rand]=array[9-i];
         array[9-i]=temp;
    }