将值分配给 Int 数组(无需重复!
本文关键字:数组 分配 Int | 更新日期: 2023-09-27 17:56:26
我需要随机为具有 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)。我做错了什么?
你的逻辑有点不对劲 - 如果 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;
}
如果条目已经存在,您将跳过它们,这就是它们为 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;
}
尽管生成N个不同的随机数(在numbers
上交换内存与循环)的性能更高:
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;
当检查失败时,您跳过一个数字。更改循环,以便在检查失败时在循环继续之前生成一个新数字
你可以做这样的事情,尽管它不一定是性能最高的:
var rnd = new Random();
var result = Enumerable.Range(0, 10000).OrderBy(i => rnd.Next()).Take(1000).ToArray();
另一种看待这个问题的方法是洗牌一个包含 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
}
从这里获取的代码示例