【问题标题】:Non duplicate random numbers in C# [duplicate]C#中的非重复随机数[重复]
【发布时间】:2013-12-24 21:55:47
【问题描述】:

我正在尝试创建一个介于 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;
    }

【问题讨论】:

  • 您需要播种随机数:例如 Randomd rnd = new Random(DateTime.Now.Millisecond)
  • 不要每次都创建一个新的 Random 实例。创建一次并将其保存在字段中。
  • 另外,numbers 列表只存在于randomNumber() 内部,并且每个调用都有“自己的”列表。你确定这是你想要的吗?另一件事:如果生成的随机数已经存在,您只会生成一个新的随机数。你不检查新生成的。
  • 不是对您的问题的解释,但您可能想考虑只创建一个从 1 到 10 的新数组并改组它。这样,您将以随机顺序获得 1-10 中的所有数字,这与您尝试做的一样; var random = new Random(); var array = Enumerable.Range(1, 10).OrderBy(x =&gt; random.NextDouble()).ToArray();

标签: c# asp.net random


【解决方案1】:

问题: 每次创建 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;
}

【讨论】:

  • 您还应该发布为什么这会起作用而不是其他?
  • @RohitVats:感谢您的宝贵意见,添加参考。
  • 移出随机数的创建并不是绝对必要的,即使在函数内部它也会给出单独的结果
  • @tariq:如果在循环中调用该方法,它可以生成重复项,在不将语句移到函数之外的情况下给予延迟会有所帮助。
  • 可能值得注意的是 Random 实际上是伪随机,相同的种子会产生相同的结果。建议用种子实例化随机数。例如,Random randNum = new Random(Date.Now.GetHashCode());
【解决方案2】:

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

Random randNum = new Random();

每次这都会产生相同的数字。只需在循环之前声明它就可以了。

您还应该考虑另一种方法,因为这不是一个好习惯。喜欢:

    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;
    }

【讨论】:

  • 为什么要考虑不同的方法?对于只有十个数字,这种方法是合理的。
  • 因为这不是一个好习惯,如果您下次需要随机 100000 个数字,那么执行此操作将花费很多时间。
猜你喜欢
  • 2010-12-09
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多