如何在Python中生成一个范围内的非素数随机数?
我很困惑如何创建一个算法来产生一定范围内的非素数我是定义函数还是创建条件语句我希望范围内的每个数字都有相同的概率例如,在1-100中,每个非素数没有1%的机会,而是有1.35%的机会。
最佳答案
现在,你没有说任何关于效率的事情,这肯定是可以优化的,但是这应该可以解决问题这应该是测试素性的有效算法:
import random
def isPrime(n):
if n % 2 == 0 and n > 2:
return False
return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
def randomNonPrime(rangeMin, rangeMax):
nonPrimes = filter(lambda n: not isPrime(n), xrange(rangeMin, rangeMax+1))
if not nonPrimes:
return None
return random.choice(nonPrimes)
minMax = (1000, 10000)
print randomNonPrime(*minMax)
返回范围内所有非素数的列表后,将从非素数列表中选择一个随机值,使选择范围内任何非素数的可能性与选择范围内任何其他非素数的可能性相同。
编辑
虽然你没有问效率,但我很无聊,所以我想出了一种方法,使
(1000, 10000000)
的范围在我的机器上花费6秒多一点,而不是一分半多一点:import numpy
import sympy
def randomNonPrime(rangeMin, rangeMax):
primesInRange = numpy.fromiter(
sympy.sieve.primerange(rangeMin, rangeMax),
dtype=numpy.uint32,
count=-1
)
numbersInRange = numpy.arange(rangeMin, rangeMax+1, dtype=numpy.uint32)
nonPrimes = numbersInRange[numpy.invert(numpy.in1d(numbersInRange, primesInRange))]
if not nonPrimes.size:
return None
return numpy.random.choice(nonPrimes)
minMax = (1000, 10000000)
print randomNonPrime(*minMax)
这使用SymPy symbolic mathematics library优化一个范围内质数的生成,然后使用NumPy过滤我们的输出并选择一个随机的非质数。
关于python - 在python中生成随机的非素数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38416864/