是否可以从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;
}
答案 0 :(得分:10)
您应该使用List
并删除所选项目,然后减少上边框。
或者更好的解决方案是复制数组和shuffle然后顺序访问将为您提供随机数。或者使用Knuth shuffling(检查评论)。
答案 1 :(得分:6)
在您执行的迭代越多时,找到未使用的值将越来越“难”,因为最终找到已使用值的概率将接近100%。还有其他选择。其中一种可能性是在尝试提取任何数字之前对源数组进行随机排序,然后按顺序将它们剥离。
答案 2 :(得分:0)
注意事项
在种子相同时,在循环中使用Random(...)
将导致重复。在您的示例中,经常会遇到相同的毫秒。
随机数重复。在大量迭代中,您可以预期该范围内的每个数字的分布相当均匀,但对于任何给定的随机生成的数字,它不能了解先前生成的数字。
要回答您的问题,您真正想要一个洗牌的数字列表,您应该能够将其调整到您的代码中:
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()
执行最近选择的号码。