Random Prime方法通过调用另一种方法

时间:2014-11-04 18:16:22

标签: java random

我很难找到这个程序。我已经找到了一个方法来确定输入的数字是否是素数但是现在我必须编写一个方法,它接受一个正的int num作为它的参数并返回一个在[0,num-1范围内的随机素数]。我不确定我是否正确使用isPrime方法。此外,我必须通过在main中调用它来测试此方法,但我不确定如何做到这一点。这是我的代码:

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;
}

2 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:0)

如果您要检查x方法中randomPrime是否为素数,为什么要在isPrime上致电0 <= i <= x?您正在检查(包括)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;
}

更新

用这样的东西测试:

public static void main(String[] args)
{
    int N = 42;
    int x = randomPrime(N);
    System.out.println(x);
}
相关问题