获得非素数及其因子低于给定的最大值

时间:2015-10-01 12:16:53

标签: java collections guava

我需要随机选择一个低于给定最大值的非素数,并返回其所有因子。

我已经将所有非素数及其因子存储在Map<Integer, Integer[]>中,并在启动时计算一次。

以下是实施的概念:

public Pair<Integer, Integer[]> getNonPrimeAndFactors(int maximum)
{
    //Randomly select a non-prime less than maximum
    return new Pair<Integer, Integer[]>(nonPrime, factors.get(nonPrime));
}

我不确定使用什么数据结构来随机选择Map中的密钥,同时仍然小于maximum。选择一个小于最大值的随机数,然后迭代调用factors.hasKey(randomNumber--)会有点废话。

我正在使用Java 7和Guava,因此可以选择Google的集合。

2 个答案:

答案 0 :(得分:2)

通过将密钥集转换为SortedSet并将头部设置保持在最大值以下,您可以获得小于最大值的随机密钥。

当你有这样一个集合时,就可以将它转换为一个列表并通过索引得到一个随机元素:

public Pair<Integer, Integer[]> getNonPrimeAndFactors(int maximum) {
    SortedSet<Integer> set = new TreeSet<>(factors.keySet()).headSet(maximum);
    List<Integer> keys = new ArrayList<>(set);
    Integer nonPrime = keys.get(ThreadLocalRandom.current().nextInt(keys.size()));
    return new Pair<Integer, Integer[]>(nonPrime, factors.get(nonPrime));
}

答案 1 :(得分:1)

生成一个低于max的随机数,通过查看表来检查它是否是非素数。如果它是从头开始的重启,即生成一个新的随机数。

由于非素数比质数更频繁,因此这个程序不会花费很长时间。