2011-06-14 2 views
1

Windows 응용 프로그램에서 작업하고 있습니다. 이 앱은 양식에 표시되는 동적 이름 목록을 포함합니다 (사용자가 특정 이름을 추가하거나 삭제할 수 있음). 내가 원하는 것은 db의 각 이름이 목록의 다른 임의의 이름을 갖고 있기 때문입니다. 유일한 조건은 각 이름에 대해 서로 다른 이름을 지정해야하며 모든 이름을 한 번만 사용해야한다는 것입니다.특정 임의의 이름을 선택하는 방법

내가 시도한 것은 List를 사용하여 db의 이름을 포함하고 List에서 임의의 인덱스를 선택하고 db의 해당 위치와 비교하는 것입니다. 다른 경우에는 해당 색인에서 제거하고 더 이상 이름을 지정할 필요가 없을 때까지 계속 수행하십시오.

그러나 그 후 나는 그것을하는 완벽한 방법이 아니라는 것을 깨달았습니다.

이름 1 무작위 이름 3 이름이 도착, 나는 5 개 이름을 가지고,의가 있다고 가정 해 봅시다 무작위로 이름 1 이름 3을 얻는다 무작위로 이름을 4 이름 4를 얻을 무작위로 이름이 및 ... 이름 (5)을 얻는다 이름 5 만 얻을 수 있으므로이 경우에는 작동하지 않습니다.

누구나 내가 어떻게 작동하게 할 수 있는지 알 수 있습니까? 다른 어떤 방법을 사용해야합니까? 이름의 수는 약 20입니다. 나중에 각 이름에 2 개의 다른 이름을 지정해야합니다. 하지만 처음에는이 문제를 해결해야합니다.

도움이 될 것입니다! C로 작성 중입니다.

+0

데이터베이스의 수 (이름)를 확인한 경우 어떻게됩니까? count (Names) % 2 == 0이면 일치하는 함수 (Names/2)를 실행하고, 그렇지 않으면 (Names/2 - 1) 번 수행하십시오. – Genzume

+2

아마도 중복 사례 (이름 5 = 이름 5)를 확인한 다음 이름 5의 이름을 다른 이름의 이름으로 무작위로 바꿀 수 있습니다. 그런 다음 이름이 중복되는지 확인하고 더 이상 존재하지 않을 때까지 반복 하시겠습니까? – novacara

+0

왜 그 결과가 잘못 되었습니까? 실제로 임의의 이름을 지정하려면 동일한 이름을 사용하는 경우가 있습니다. – svick

답변

2

1 월은 저를 때려 눕혔습니다.하지만 여기서는 선택되지 않은 이름이 일치하는 경우 어떻게 마지막 두 코드를 전환해야하는지 설명하기 위해 코드를 작성했습니다. DB에서

static void Main(string[] args) 
    { 
     List<string> names = new List<string>() { "Jeff", "John", "Joe", "Jack", "Jim" }; 
     List<string> otherNames = new List<string>() { "Jeff", "John", "Joe", "Jack", "Jim" }; 

     Random r = new Random(); 

     for (int i = 4; i >= 0; i--) 
     { 
      int pick1 = r.Next(i); 
      int pick2 = r.Next(i); 
      while (names[pick1] == otherNames[pick2]) 
      { 
       pick2++; 
       if (pick2 >= otherNames.Count) pick2 = 0; 
      } 
      if (names.Count == 2) 
      { 
       // when you only have 2 names left, if the other names match... 
       if (names[1 - pick1] == otherNames[1 - pick2]) 
       { 
        // swap one of the picked names 
        pick2 = 1 - pick2; 
       } 
      } 
      Console.Write(names[pick1]); Console.Write(" != "); Console.WriteLine(otherNames[pick2]); 
      names.RemoveAt(pick1); 
      otherNames.RemoveAt(pick2); 
     } 
     Console.ReadKey(); 
    } 
+0

고마워요, 그 일을해야합니다. – Grentley

+0

이것을 코딩 해 주셔서 감사합니다. 모바일 브라우저를 사용 중입니다. +1 – Jan

2

제안한 방법을 사용하고 설명한 문제가 발생했을 때 마지막 두 요소를 바꿔 넣기 만하면됩니다.

+0

Yeap은 그렇게하기 쉽지만 목록에 약 20 명의 이름이 있습니다. 그런 문제가 더 많이 발생하면 어떻게 될까요? – Grentley

+0

복제본을 선택하는 경우 다른 이름이 될 때까지 다른 임의의 이름을 선택하십시오. 마지막 하나가 복제본이라면, 마지막으로 두 번째로 바꾸십시오 ... – Jan

0
while (position == 0) { 
    position = randInt() % nameCount; 
} 

for (int i=0;i<nameCount;i++) { 
    addPair(i,position); 
    position++; 
    if (position>=nameCount) position=0; 
} 

이름 논리적 nameCount-0에서 1로 넘버링되고; 아이디어는 두 번째 이름에 대해 임의의 위치를 ​​선택한 다음 끝까지 롤오버하도록하는 것입니다.

이것은 의사 코드입니다. 나는 C#을 모른다.

큰 질문입니다!

0

this similar problem 또는 ruby quiz 2의 답변을 아이디어로 볼 수 있습니다.

기본적으로 목록을 복사하고 복사본을 임의로 뒤집어서 두 줄을 긋을 수 있습니다. 그러나 그것은 당신이 가진 동일한 문제로 끝날 수 있습니다. 그러나 목록을 살펴보면 각각의 자체 참조로 교체 할 수 있습니다.

0

List<string> names 하나를 섞어서 하나의 항목을 아래로 이동 (마지막 항목이 먼저 나옴)하고 위치별로 이름을 일치시키는 것이 더 간단 할 것이라고 생각합니다. 한 번의 패스로 중복이 없도록합니다.