2014-11-04 4 views
-3

이 프로그램을 알아 내려고 힘듭니다. 입력 된 숫자가 소수인지 알아내는 방법을 만들었지 만 이제는 양의 정수를 매개 변수로 사용하여 [0, num-1] 범위의 임의의 소수를 반환하는 메서드를 작성해야합니다. ]. isPrime 메서드를 올바르게 사용하고 있는지 확실하지 않습니다. 또한이 메서드를 주에서 호출하여 테스트해야하지만 그 방법도 잘 모르겠습니다. 여기 내 코드가 있습니다 :Random Prime 다른 메서드를 호출하여 메서드를

public static boolean isPrime(int num) 
{ 
    for(int i = 2; i<= num-1;i++) 
    { 
     if (num % i == 0) 
     { 
      return false; 
     }   
    } 
    return true; 
} 

public static int randomPrime(int num) 
{ 
    Random r = new Random(); 
    int x = r.nextInt(num); 

    for(int i = 0; i <= x; i++) 
    { 
     if(!isPrime(x)) 
     { 
      num = x; 
     } 
    } 
    return x; 
} 
+0

이야 'num = x'을 할당하면 그 정보로 아무 일도하지 않게됩니다. 대신, 0과 num-1 사이의 모든 소수의리스트를 먼저 만들고 나서, "the"random prime을 반환하려면 0과 list.size() - 1 (포함하는) 사이의 무작위 인덱스를 선택하고 리턴리스트 .get (that_index) –

답변

0

이것은 효율적인 방법이 아닙니다. Eratosthene sieve을 구성한 다음 임의의 항목을 선택하도록 권장합니다. 여기

내가 어떻게 할 것입니다 :

public static Random rd = new Random(System.currentTimeMillis()); 

public static int randomPrime(int num) { 
    Boolean[] sieve = new Boolean[num+1]; 
    sieve[0] = true; 
    sieve[1] = true; 
    for (int i=2 ; i<num.length ; i++) 
     if (!sieve[i]) 
      for (int j = 2*i ; j<num.length ; j += i) 
       sieve[j] = true; 

    List<Integer> primes = new LinkedList<>(); 
    for (int i=0 ; i<sieve.length ; i++) 
     if (!sieve[i]) primes.add(i); 

    return primes.isEmpty() ? -1 : primes.get(rd.nextInt(primes.size()); 
} 
+0

답변보다 댓글이 많습니다. 비효율적 인 반면, isPrime 메서드는'randomPrime'을 실행하기 위해 올바른 대답을 얻는 측면에서 작동해야합니다. –

+0

my isPrime 메서드가 제대로 작동하지만 지시에 따라이 방식으로 작성해야합니다. 루프를 사용해야 만 볼 수 있습니다. 생성 된 숫자가 소수인지 아닌지를 나타냅니다. 그것은 다음 종료하고 번호를 반환합니다, 그렇지 않으면 나는 새 번호를 생성해야합니다. 또한 나는 이것을 어떻게 테스트할지는 모르겠다. –

+0

'isPrime'에 대해서는 아무런 언급도하지 않았기 때문에 제 대답을 자세히 살펴보십시오. 나는 isPrime (x)를 올바른 장소에서 움직이면'randomPrime'에 대한 픽스를 제안 할 수 있습니다. 그러나 수정 후에도 0과 x 사이의 첫 번째 프라임이기 때문에 항상 2를 반환합니다 (x> = 2라고 가정하고, 이 코드는 심지어 보증하지도 않습니다). 체는 훨씬 좋은 아이디어입니다. – Dici

0

당신은 왜 0 <= i <= xisPrime를 호출, xrandomPrime 방법에 소수 있는지 확인하는 경우? 0과 x 사이의 숫자가 소수인지 확인합니다. 그것은 당신이 원하는 것이 아닙니다.

나는 이것이 알고리즘의 과감한 변화없이 당신을 위해 트릭을해야한다고 생각합니다. 참고 :이 코드는 난수 생성기 및 시드 값을 기준으로 종료하는 데 오랜 시간이 걸릴 수 있으며 실제로 종료되지 않을 수도 있습니다. (당신의 난수 생성기는 합성 수를 생산하는 경우를 생각해 보자.)

public static int randomPrime(int num) 
{ 
    Random r = new Random(); 
    int x = r.nextInt(num); 

    while(!isPrime(x)) 
    { 
     x = r.nextInt(num); 
    } 
    return x; 
} 

업데이트 :이 같은 뭔가

테스트를 : 당신이 당신의`randomPrime` 방법에

public static void main(String[] args) 
{ 
    int N = 42; 
    int x = randomPrime(N); 
    System.out.println(x); 
} 
+0

대단히 감사합니다. 이 방법을 주 방법으로 테스트 할 때 조언이 있습니까? –

+0

어떤 조언이 있습니까? 나는 당신이 여기서 무엇을 요구하고 있는지 확신하지 못한다. –

+0

죄송합니다. 메소드가 main 메소드에서 호출하여 작동하는지 확인해야합니다. 내 지시에 따라 randNumber를 매개 변수로 사용하여 isPrime 메서드를 호출합니다. –

관련 문제