2017-12-18 8 views
-1

새로운 숫자 값을 생성하는이 방법이 있지만 기능을 완료하는 데 오랜 시간이 걸립니다. 빠른 승인에서 임의의 숫자를 생성하는 방법은 무엇입니까?주어진 숫자 배열에 존재하지 않는 숫자 값을 생성하는 방법은 무엇입니까?

public int GeneratenewID(int[] OptionId) 
    { 
     Random ran = new Random(); 
     int SearchId = ran.Next(1, OptionId.Length*2); 
     if (!OptionId.Contains(SearchId)) 
     { 
      return SearchId; 
     } 
     else 
     { 
      return GeneratenewID(OptionId); 
     } 
    } 
+2

그것은 거의 확실 깨진 셔플 알고리즘이다. Google "C# fisher yates shuffle" –

+6

한발 뒤로 물러나서 ** 왜 ** 당신이 필요하다고 생각하는지 설명하십시오. XY 문제 - https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem과 같은 냄새가납니다. – mjwills

+5

함수에서'Random ran = new Random(); '을 취하고 랜덤 인스턴스에 클래스 필드를 사용하십시오. 무작위 빈 생성자가 시스템 시간을 시드로 사용하고 시스템 시간이 변경되기 전에 재귀 메서드에서 몇 번 실행되기 때문에 시간이 오래 걸리므로 동일한 번호가 반복해서 생성됩니다. –

답변

0

이 확실히 그렇게 노력을 위해 일 것입니다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication4 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int [] OptionId=new int[] 
      { 
       0, 1,4,7,3,1,37,9 
      }; 
      Program p = new Program(); 

      int a= p. GeneratenewID(OptionId); 

     } 


     public int GeneratenewID(int[] OptionId) 
     { 
      Random ran = new Random(1); 
      int number = 0; 
      for (int j = 0; j < OptionId.Length ; j++) 
      { 
       number = ran.Next(OptionId.Length); 
       if (!OptionId.Contains(number)) 
        break; 
       else 
        j--; 
      } 
      return number; 
     } 
    } 
} 
+0

왜'for' 문 *과'for' 문 모두에서'j'를 증가시키고 있습니까? 이 접근에는 어떤 이점이 있습니까? –

+0

실수로 타이핑해서 죄송합니다 ... –

+0

for loop? 재귀 적으로 끝나면. 너 설명 할 수 있니? – Anil