我很难弄清楚这个程序。我已经制定了一个方法来确定输入的数字是否是素数,但现在我必须编写一个方法,以正整数作为参数,并返回[0,num-1]范围内的随机素数。我不确定我是否正确地使用了isPrime方法。此外,我还必须通过在主体中调用它来测试这个方法,但我也不确定如何做到这一点。这是我的代码:
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;
}
这不是一种有效的方法。我建议你构建一个Eratosthene筛,然后随机选择一个。
以下是我的做法:
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());
}
如果要检查x
在randomPrime
方法中是否为素数,为什么要在0 <= i <= x
上调用isPrime
?您正在检查0和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);
}