【问题标题】:Random Prime Methods by calling another method通过调用另一个方法随机 Prime 方法
【发布时间】:2014-11-04 18:16:22
【问题描述】:

我很难弄清楚这个程序。我已经制定了一种方法来确定输入的数字是否是素数,但现在我必须编写一个方法,该方法将正 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;
}

【问题讨论】:

  • 在您的randomPrime 方法中分配num = x,然后您对这些信息什么也不做。相反,您可能希望首先构建 0 和 num-1 之间的所有素数的列表,然后返回“随机素数”,选择 0 和 list.size()-1(含)之间的随机索引并返回列表.get(that_index)

标签: java random


【解决方案1】:

这不是一种有效的方法。我建议您构造一个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());
}

【讨论】:

  • 这更像是一个评论而不是一个答案。虽然效率低下,但他的 isPrime 方法应该可以为运行randomPrime 获得正确答案
  • 我的 isPrime 方法工作正常,我必须按照说明这样写,我必须使用循环来查看生成的数字是否为素数。如果是,那么我退出并返回号码,如果不是,那么我必须生成一个新号码。另外我不确定如何在主中进行测试。
  • 我没有对isPrime做任何评论,仔细看我的回答。我可以通过将isPrime(x) 移动到正确的位置来建议randomPrime 的修复,但即使在修复之后,它也将始终返回 2,因为它是 0 和 x 之间的第一个素数(假设 x >= 2,此代码甚至不保证)。筛子是一个更好的主意。
  • 再次,按照说明,我必须在 randomPrime 方法中调用 isPrime 方法,检查它是否为素数,如果不是则生成新数并继续循环直到生成素数。
  • @AmandaMerical 有时指令很愚蠢,必须忽略。如果您有充分的理由忽略作业说明,并且可以争辩为什么您的解决方案更好,那么您可以按照自己的方式去做。
【解决方案2】:

如果您正在检查 x 是否在您的 randomPrime 方法中是素数,您为什么要在 0 &lt;= i &lt;= x 上调用 isPrime?您正在检查(含)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);
}

【讨论】:

  • 非常感谢您的好意。当我在 main 方法中测试这个时,你有什么建议吗?
  • 什么样的建议?我不确定你在这里要求什么。
  • 对不起,我必须通过在 main 方法中调用该方法来测试以确保该方法有效。我的指令说通过 randNumber 作为参数调用 isPrime 方法。
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多