如果你只產生1000 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;
}
現在,你可以返回前1000號,或者你可以寫一個方法返回每當它被調用時,下一個按順序排列。
你的問題真的是關於如何生成一組唯一的隨機數。例如,您可以使用一種算法,就像在[生成唯一隨機數字]中可以看到的那樣(http://java.about.com/od/javautil/a/uniquerandomnum.htm)。 – user1929959 2013-03-08 20:34:11
需要爲符合以下要求的C#應用程序生成唯一編號。 1. 6位數字。 2. 關於1000個號碼中產生日常 那是我的問題,它是如此簡單和明確一點,我詢問算法來生成唯一randam數 – user2120457 2013-03-08 20:44:36
你今天生成數字可以是你昨天發生的那些的副本? – 2013-03-08 21:18:18