2013-03-08 471 views
-2

我需要爲符合以下要求的C#應用​​程序生成唯一的編號。獨特的6位數字生成器算法

  1. 6位數。

  2. 關於1000個號碼中產生日常

    byte[] buffer = Guid.NewGuid().ToByteArray(); 
    return string.Concat(((int)type).ToString(), 
    BitConverter.ToInt64(buffer, 0).ToString().Substring(1,  
           6-((int)type).ToString().Length)); 
    

目前,我使用這種算法,但重複出現,所以我想另外一個契合上述質量要求。

+0

你的問題真的是關於如何生成一組唯一的隨機數。例如,您可以使用一種算法,就像在[生成唯一隨機數字]中可以看到的那樣(http://java.about.com/od/javautil/a/uniquerandomnum.htm)。 – user1929959 2013-03-08 20:34:11

+0

需要爲符合以下要求的C#應用​​程序生成唯一編號。 1. 6位數字。 2. 關於1000個號碼中產生日常 那是我的問題,它是如此簡單和明確一點,我詢問算法來生成唯一randam數 – user2120457 2013-03-08 20:44:36

+0

你今天生成數字可以是你昨天發生的那些的副本? – 2013-03-08 21:18:18

回答

0

如果你只產生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號,或者你可以寫一個方法返回每當它被調用時,下一個按順序排列。