【发布时间】:2019-07-24 13:58:29
【问题描述】:
我正在尝试生成两个随机整数,每个整数都有自己的潜在值范围。我保留了每个值的运行总和,并且需要确保这些总和之间的比率保持在给定值的范围内。
对于每次试验,我希望两个数字都是随机的。 IE。我不想生成一个值,然后计算另一个值来获得我想要的比率。
我发现的最佳解决方案是针对每次试验,只生成随机数对,直到随机数对符合我的约束条件。但是它不能保证找到解决方案,并且可能会循环很长时间。
import random
XMIN, XMAX = 64, 2500
YMIN, YMAX = 16, 2000
GOAL, THRESH =0.90, 0.03
def trial(sumX, sumY):
x,y=0,0
while True:
x = random.randint(XMIN,XMAX)
y = random.randint(YMIN,YMAX)
if abs( (sumX+x)/(sumX+x+sumY+y)-GOAL) <= THRESH:
return x,y
sumX,sumY=0,0
for I in range(10000):
x,y=trial(sumX,sumY)
trial_ratio = x/(x+y)
sumX, sumY = sumX+x, sumY+y
sum_ratio = sumX/(sumX+sumY)
print(f"+({x:5d}, {y:5d}) = {trial_ratio:0.2%} : ({sumX:8d}, {sumY:8d}) = {sum_ratio:0.2%}")
sn-p是python的,语言无所谓
上述工作按预期工作,但是如果可能的话,我希望能够更快地终止,而不是仅仅进行随机猜测并抛出无效结果。
【问题讨论】:
-
如果在生成之前为每个随机数计算一个新的可接受范围(基于之前的数字),就不会有“抛出无效结果”的问题。
-
(XMAX-XMIN) 和 (YMAX - YMIN) 有多大
-
@GauravMathur 这些值是任意的(用户可选择),但 sn-p 顶部的值不会异常。 GOAL 和 THRESH 在 0 和 1 之间确实是任意的。
-
@RobertHarvey 这不会导致允许的范围收敛到一个值吗?此时这些值不再是随机的。
-
我想它会产生与丢弃结果相同的效果,直到你得到一个在范围内的结果,除了它会更快。
标签: random