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