如何生成不重复的唯一随机整数
本文关键字:唯一 随机 整数 何生成 | 更新日期: 2023-09-27 18:17:31
我创建了一个简短的程序,它创建了1-9之间的3个随机整数,并将它们存储在一个数组中,但是,我不希望它们中的任何一个重复,也就是说,我希望每个都是唯一的。有没有一种更简单的方法来生成3个唯一的整数,而不是必须遍历数组并将每个整数相互比较?如果我要把数组增加到超过3个整数,这看起来很乏味。这是我生成3个随机数的代码。我看到其他Java代码,但我想c#可能有更简单、更有效的方法。
var number = new Numbers[3];
Random r = new Random();
for ( int i = 0; i < number.Length; i++)
{
number[i] = new Numbers(r.Next(1,9));
}
Console.WriteLine("The Three Random Numbers Are:");
foreach(Numbers num in number)
{
Console.WriteLine("{0}", num.Number);
}
我会这样做:
var range = Enumerable.Range(1, 8);
var rnd = new Random();
var listInts = range.OrderBy(i => rnd.Next()).Take(3).ToList();
您可以将可能生成的数字制作成数组或列表,例如0,1,2,3。然后你生成一个从0到这个列表长度的数字,例如2,然后选择list[2],这样下次你的列表中就只有0,1,3了。生成它需要更长的时间,特别是对于长列表,但它不重复数字。
using System;
using System.Collections.Generic;
public class Test
{
static Random random = new Random();
public static List<int> GenerateRandom(int count)
{
// generate count random values.
HashSet<int> candidates = new HashSet<int>();
// top will overflow to Int32.MinValue at the end of the loop
for (Int32 top = Int32.MaxValue - count + 1; top > 0; top++)
{
// May strike a duplicate.
if (!candidates.Add(random.Next(top))) {
candidates.Add(top);
}
}
// load them in to a list.
List<int> result = new List<int>();
result.AddRange(candidates);
// shuffle the results:
int i = result.Count;
while (i > 1)
{
i--;
int k = random.Next(i + 1);
int value = result[k];
result[k] = result[i];
result[i] = value;
}
return result;
}
public static void Main()
{
List<int> vals = GenerateRandom(10);
Console.WriteLine("Result: " + vals.Count);
vals.ForEach(Console.WriteLine);
}
}
从这里收集解释和答案
源http://ideone.com/Zjpzdh