C# 创建随机数

C# 创建随机数,c#,C#,是否可以从c#中选择的数字中创建一个随机数 例如,我有一个从1到90的数字数组,一旦一个数字被调用,该数字的属性就会改变。因此,我只想在属性没有改变的地方生成数字。 因此,这只会随机调用1到90之间的数字 我已经使用了一个循环来完成这项工作,但如果可能的话,我只想使用一个更简洁、更简洁的方法 我目前的代码是: public object GenerateNumber() { bool alreadyCalled = false; while (!a

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

例如,我有一个从1到90的数字数组,一旦一个数字被调用,该数字的属性就会改变。因此,我只想在属性没有改变的地方生成数字。 因此,这只会随机调用1到90之间的数字

我已经使用了一个循环来完成这项工作,但如果可能的话,我只想使用一个更简洁、更简洁的方法

我目前的代码是:

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

您应该使用
列表
删除所选项目,然后减少上边框。
或者更好的解决方案是复制数组,然后顺序访问将给您随机数。或者使用Knuth shuffling(检查注释)。

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

需要注意的事项

  • 当种子相同时,在循环中使用
    Random(…)
    将导致重复。在您的示例中,相同的毫秒将经常被命中

  • 随机数重复。在大量的迭代过程中,对于范围内的每个数字,您都希望分布相当均匀,但是对于任意给定的随机生成的数字,它无法了解以前生成的数字

  • 要回答您的问题,您真正想要的是一个混乱的数字列表,您应该能够将其调整到您的代码中:

    var randomOrderInts = Enumerable.Range(1, 91).OrderBy(x => Guid.NewGuid());
    
    list myNumbers=GetNumbers();
    随机r=新随机();
    while(myNumbers.Count()>0)
    {
    int index=r.Next(myNumbers.Count());
    ReportSelectedNumber(MyNumber[索引]);
    myNumbers.RemoveAt(索引);
    }
    

    确保您有
    GetNumbers()
    可以返回您希望从中选择的号码列表,以及
    ReportSelectedNumber()
    用于对最近选择的号码执行操作。

    旁注:您最好将“Random randomNumber=new Random”移出循环,然后调用“randomNumber.Next”在循环中多次出现。还可以使用“new Random()”而不是传入种子。关于为什么这是一个好的实践的更多细节是在C#版本的(最优秀的)洗牌算法出现在本页的中间,讨论了为什么它好:如果你想要一个更快的算法,Knuth洗牌可以在每个变量的O(1)时间内完成,每次只洗牌一个值,根据要求。我想这已经接近了,但我仍然有问题。如果我有一个数字1,2,3,4,5的列表,并且调用的数字是2,那么您的示例将显示1,2,3,4,但是我希望随机数在1,3,4,5之间搜索。希望这足够清楚:-)好吧,我正在再次阅读你的评论、我的代码、你的评论、我的代码,我确信它会像你想要的那样显示数字。因此,如果第一个索引结果为1,则将选择第2个索引并从列表中删除。然后,从0-3(含0-3)中选择随机数,列表读数为1,3,4,5。下一个random将从该列表中删除并打印一个。。。等等…你在这里模拟某种乐透吗?是的,没错:-)我意识到我的错误-我用索引作为数字lol。-谢谢你的帮助,它现在工作得很好。NP,除了我的答案之外,你总是可以用复选标记来回报我:)
    list<int> myNumbers=GetNumbers();
    Random r=new Random();
    while (myNumbers.Count()>0)
    {
      int index=r.Next(myNumbers.Count());
      ReportSelectedNumber(myNumbers[index]);
      myNumbers.RemoveAt(index);
    }