2013-03-08 5 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

+0

необходимо создать уникальные номера для моего приложения C#, удовлетворяющего нижеследующим требованиям. 1. 6 разряд. 2. около 1000 номеров, которые будут генерироваться каждый день Вот моим вопрос это так просто и ясно, что я прошу об алгоритме для генерации уникального Randam числа – user2120457

+0

Может число порождающего сегодня дубликаты те, которые вы сгенерированные вчера ? –

ответ

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 номеров или вы можете написать метод для возвращения следующий в последовательности всякий раз, когда он вызывается.

Смежные вопросы