我需要随机为1000个元素的IntArray赋值。但这些要素不能重复。我用过这段代码......
public int[] Numbers()
{
Random random = new Random();
int check;
for (int i = 0; i < numbers.Length; i++)
{
check = random.Next(0, 9999);
while (!numbers.Contains(check))
{
numbers[i] = check;
}
}
return numbers;
}
然后,一定数量的数字得到默认值(0)。我做错了什么?
答案 0 :(得分:4)
您的逻辑稍微偏离 - 如果Contains()失败,您仍需要分配该索引:
for (int i = 0; i < numbers.Length; i++)
{
check = random.Next(0, 9999);
while (numbers.Contains(check))
{
// The number existed, so recompute...
check = random.Next(0, 9999);
}
numbers[i] = check;
}
答案 1 :(得分:2)
如果条目已存在,则跳过条目,这就是为什么它们为0.更改while
循环:
for (int i = 0; i < numbers.Length; i++)
{
check = random.Next(0, 9999)
while (numbers.Contains(check))
{
check = random.Next(0, 9999)
}
numbers[i] = check;
}
虽然性能更高(交易内存与循环超过numbers
)意味着生成N个不同的随机数:
int ii = 0;
var numbers = new int[N];
var used = new HashSet<int>(); // much faster on lookups than Array.Contains
while (used.Count < N)
{
var check = random.Next();
if (used.Add(check)) numbers[ii++] = check;
// alternatively: if (used.Add(numbers[ii] = check)) ii++;
}
return numbers;
答案 2 :(得分:0)
如果检查失败,则跳过一个数字。更改循环,以便在检查失败时,在循环继续之前生成新数字
答案 3 :(得分:0)
你可以做这样的事情,虽然它不一定是性能最好的:
var rnd = new Random();
var result = Enumerable.Range(0, 10000).OrderBy(i => rnd.Next()).Take(1000).ToArray();
答案 4 :(得分:-1)
另一种看待这种情况的方法是随机播放1000个物品的订单数组 你可以使用这样的东西:
public T[] Shuffle<T>(T[] array)
{
var random = _random;
for (int i = array.Length; i > 1; i--)
{
// Pick random element to swap.
int j = random.Next(i); // 0 <= j <= i-1
// Swap.
T tmp = array[j];
array[j] = array[i - 1];
array[i - 1] = tmp;
}
return array;
}
然后像那样使用它
int[] values = new int[1000]
for (int i=0; i<999; i++)
values[i] = i;
values = Shuffle<int>(values);
foreach (int item in values)
{
Response.Write(item);
}
Response.Write("</br>");
values = Shuffle<int>(values);
foreach (int item in values)
{
Response.Write(item); //this will generate a unique random from 0-999
}
取自here
的代码示例