创建随机数

时间:2010-10-12 13:38:46

标签: c#

是否可以从c#中的数字选择中创建一个随机数。

例如,我有一个1-90的数字数组,一旦数字被称为该数字的变化。因此,我只想生成该属性未更改的数字。 因此,这将仅随机调用1到90之间的数字。

我使用循环完成了这项工作但是如果可能的话,只需要一个quiker和更干净的方法。

我目前的代码是:

    public object GenerateNumber()
    {
        bool alreadyCalled = false;
        while (!alreadyCalled)
        {
           Random randomNumber = new Random(System.DateTime.Now.Millisecond);
            int RandomNumberCalled = randomNumber.Next(1, 91);             


            if (Numbers.ToList().Find(x => x.Number == RandomNumberCalled).IsCalled != null)
            {    

             // change number to is called and do other things. 

            }
        }
        return false;
    }

4 个答案:

答案 0 :(得分:10)

您应该使用List并删除所选项目,然后减少上边框。 或者更好的解决方案是复制数组和shuffle然后顺序访问将为您提供随机数。或者使用Knuth shuffling(检查评论)。

答案 1 :(得分:6)

在您执行的迭代越多时,找到未使用的值将越来越“难”,因为最终找到已使用值的概率将接近100%。还有其他选择。其中一种可能性是在尝试提取任何数字之前对源数组进行随机排序,然后按顺序将它们剥离。

答案 2 :(得分:0)

注意事项

  1. 在种子相同时,在循环中使用Random(...)将导致重复。在您的示例中,经常会遇到相同的毫秒。

  2. 随机数重复。在大量迭代中,您可以预期该范围内的每个数字的分布相当均匀,但对于任何给定的随机生成的数字,它不能了解先前生成的数字。

  3. 要回答您的问题,您真正想要一个洗牌的数字列表,您应该能够将其调整到您的代码中:

    var randomOrderInts = Enumerable.Range(1, 91).OrderBy(x => Guid.NewGuid());
    

答案 3 :(得分:0)

list<int> myNumbers=GetNumbers();
Random r=new Random();
while (myNumbers.Count()>0)
{
  int index=r.Next(myNumbers.Count());
  ReportSelectedNumber(myNumbers[index]);
  myNumbers.RemoveAt(index);
}

确保您GetNumbers()将返回您希望从中选择数字的列表,并ReportSelectedNumber()执行最近选择的号码。