如果您只生成 1,000 个 6 位数字,则非常简单:
int NumberToGenerate = 1000;
Random rnd = new Random();
HashSet uniqueNumbers = new HashSet<int>();
while (uniqueNumbers.Count < NumberToGenerate)
{
int next = Random.Next(100000, 1000000);
uniqueNumbers.Add(next);
}
循环几乎肯定会产生一些重复,但HashSet
会拒绝它们。
另一种方法是创建一个从 100,000 到 999,999 的所有数字的列表。然后,当您需要一个数字时,从列表中随机删除一个项目。
private List<int> allNumbers = new List<int>();
// in the constructor
for (var i = 100000; i < 1000000; ++i)
{
allNumbers.Add(i);
}
private Random rnd = new Random();
public int GetNumber()
{
var index = rnd.Next();
var rslt = allNumbers[index];
allNumbers.RemoveAt(index);
return rslt;
}
打电话RemoveAt
有点贵。您可以通过以下方式加快速度:
// move the last number in the list to fill the hole
allNumbers[index] = allNumbers[allNumbers.Count-1];
// remove the last item
allNumbers.RemoveAt(allNumbers.Count-1);
这将最大限度地减少在删除中移动的内存量。
或者,您可以创建所有数字的列表,将它们随机排列,然后从前面返回它们:
// assume you've created the list of numbers, as above
// Shuffle them
for (int i = 0; i < allNumbers.Count; ++i)
{
int j = rnd.Next(i, allNumbers.Count);
int temp = allNumbers[i];
allNumbers[i] = allNumbers[j];
allNumbers[j] = temp;
}
现在,您可以返回前 1,000 个数字,或者您可以编写一个方法,以便在调用时按顺序返回下一个数字。