我能够编写一个能够生成" unique&& amp;&随机"范围内的整数。但这在n 2 。我在一个地方使用它6个随机整数,在另一个地方使用30个随机整数,那么如果需要改进它,我们如何改进呢?
private int[] genRands(int max, int totalRandomIntsRequired)
{
int[] nums = new int[totalRandomIntsRequired];
Random r = new Random();
for (int i = 0; i < totalRandomIntsRequired; i++)
{
nums[i] = r.Next(0, max + 1);
for (int j = i; j >= 0; j--)
{
if(nums[i] == nums[j])
{
nums[i] = r.Next(0, max + 1);
}
}
}
return nums;
}
答案 0 :(得分:5)
这是一种HashSet
的方法,它不允许重复和作为有效的内部重复检查。
public static int[] genRands(int total, int max)
{
if (max < total)
{
throw new IndexOutOfRangeException();
}
Random _random = new Random();
HashSet<int> Result = new HashSet<int>();
while (Result.Count < total)
{
Result.Add(_random.Next(0, max));
}
return Result.ToArray();
}
答案 1 :(得分:0)
我对你的要求有点困惑,如果你只需要生成6个或n个随机数,为什么要循环两次?无论哪种方式,你都可以尝试这个
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
var rands = genRands(100, 6);
foreach (var num in rands.Select((n, i) => new { i= i + 1, n }))
{ Console.WriteLine(string.Format("[{0}] {1}", num.i, num.n));};
Console.ReadLine();
}
private static List<int> genRands(int max, int total)
{
var nums = new List<int>();
Random r = new Random();
for (int i = 0; i < total; i++)
nums.Add(r.Next(0, max));
return nums;
}
}
}
应输出类似这样的内容
[1] 45
[2] 29
[3] 40
[4] 75
[5] 29
[6] 57