2013-03-08 2 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)); 
    

현재, 내가이 알고리즘을 사용하고 있지만, 중복이 발생 생성, 그래서 위 한 요구 사항과 다른 착용감을 원하는합니다. 만 천 6 자리 숫자를 생성하는 경우

+0

귀하의 질문은 정말 고유 한 난수 세트를 생성하는 방법에 관한 것입니다. 예를 들어, [고유 난수 생성] (http://java.about.com/od/javautil/a/uniquerandomnum.htm)에서 볼 수있는 알고리즘을 사용할 수 있습니다. – user1929959

+0

은 아래 요구 사항을 충족하는 C# 응용 프로그램의 고유 번호를 생성해야합니다. 1. 6 자리. 2. 약 1000 번호는 그렇게 간단하고 난 당신이 오늘 생성 숫자가 어제 생성 된 것들의 중복이 될 수있는 고유 RANDAM 번호 – user2120457

+0

를 생성하는 알고리즘에 대한 요구하고 있음을 분명 내 질문에 그게 전부 일상 를 생성한다 ? –

답변

0

, 그것은 꽤 쉽게 :

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 번호를 반환하거나 반환하는 방법을 쓸 수 있습니다 그것이 호출 될 때마다 순서대로 다음 하나가됩니다.