不重复随机数生成一个1-20的随机数,我需要选择性的选择,应该不会重复。如何在C#中做到这一点注意我需要像这样循环Randomrnd=newRandom()rnd.Next(1,20)for(inti=0;i<=20;i++){}对于所有循环,Numbers应该be1to20“不应重复”到底是什么意思?如果你的意思是你不想得到任何副本,那么你基本上应该拿一个数字1-20的列表,将它们打乱,然后一次从列表的头部抓取一个。请参阅此StackOverflow答案,了解重新排列列表的有效方法。如果您只是说您当前的尝试给出了5,5,5,5,5,5,1,1,1,1,1,1,1,1,2,2,2,2,2等,那么机会每次选择一个数字时,您是否都在创建一个新的Random实例:不要那样做。每次创建实例时,它都会使用当前时间作为随机数生成器的“种子”(除非您明确指定一个)。这意味着如果您快速连续创建多个实例,每个实例将获得相同的种子,从而给出相同的数字序列。相反,使用Random的单个实例来使用它。(注意它不是线程安全的,这很痛苦。)例如:privatestaticreadonlyRandomRng=newRandom();publicintNextNumber(){返回Rng.Next(20)+1;这不是线程安全的,但如果这是一个问题请告诉我们。另一种方法是将Random传递给方法(当然通常更复杂):publicintNextNumber(Randomrng){returnrng.Next(20)+1;调用者然后可以适当地重用该实例。如果您想要一种线程安全的方式来生成随机数,您可能需要查看我在MiscUtil中的StaticRandom类。(请注意,使用rng.Next(1,21)也可以正常工作-我碰巧更喜欢上面的版本,因为我认为它减少了围绕包含/排他边界的猜测,但这是个人品味的问题。)此方法将生成所有数字并且不会重复任何数字://////返回所有数字,包括最小值和最大值之间的随机序列一次。///IEnumerableUniqueRandom(intminInclusive,intmaxInclusive){候选列表=newList();对于(inti=minInclusive;i0){intindex=rnd.Next(candidates.Count);收益率回报候选人[指数];candidates.RemoveAt(索引);你可以像这样使用它:Console.WriteLine("Allnumbersbetween0and20inrandomorder:");foreach(intiinUniqueRandom(0,20)){Console.WriteLine(i);}一个IEnumerable实现,基于Hallgrim的回答:publicclassUniqueRandoms:IEnumerable{Random_rand=newRandom();列出_candidates;publicUniqueRandoms(intmaxInclusive):this(1,maxInclusive){}publicUniqueRandoms(intminInclusive,intmaxInclusive){_candidates=Enumerable.Range(minInclusive,maxInclusive-minInclusive+1).ToList();}publicIEnumeratorGetEnumerator(){while(_candidates.Count>0){intindex=_rand.Next(_candidates.Count);收益回报n_candidates[索引];_candidates.RemoveAt(索引);}}System.Collections.IEnumeratorSystem.Collections.IEnumerable.GetEnumerator(){返回GetEnumerator();它在随机性等方面与其他方法相比如何。但它似乎有效:Listintegers=newList(){1,2,3,4,5,6,7,8,9,10,11,12};随机rnd=newRandom();varints=fromiinintegersorderbyrnd.Next(integers.Count)selecti;来自MSDN“提高随机性的一种方法是使种子值随时间变化。”另一个事实是您应该“创建一个随机数以随时间生成许多随机数”。这将增强随机生成classProgram{staticvoidMain(string[]args){Listlist=newList();整数值;随机r;int初始计数=1;整数计数=7;int最大随机值=8;while(IntialCount下面是一个很好的做法,我这里用的是字符串,你可以把列表的类型改成任何你想要的...,试试看:ListNamesList=newList(){"Name1","Name2","Name3","Name4","Name5"};Randomrnd=newRandom();//现在随机获取上面的"WithoutRepeating.."for(inti=0;iblow代码生成65到0到92之间的唯一随机数,并返回数组中的唯一随机数。以上就是C#学习教程:不重复随机数共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——publicstaticint[]RandomNumbers_Supplier(){RandomR=newRandom();int[]RandomNumbers=newint[65];intk=0,温度;boolIsRepetitive=false;while(kstaticvoidMain(string[]args){//从25中随机化15个数字-从1到25-按升序排列varrandomNumbers=newList();varrandomGenerator=newRandom();intinitialCount=1;for(inti=1;iConsole.WriteLine(x));代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载请注明出处:
