我需要随机选择一个低于给定最大值的非素数,并返回其所有因子。
我已经将所有非素数及其因子存储在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的集合。
答案 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的随机数,通过查看表来检查它是否是非素数。如果它是从头开始的重启,即生成一个新的随机数。
由于非素数比质数更频繁,因此这个程序不会花费很长时间。