我正在尝试从1-100生成n次随机整数。但首先从1到25,产生它的概率是1/8。从26到50是1/2的几率。子范围51到75是1/4,子范围从76到100具有1/8的生成机会。我知道如何生成一个随机的int 1-100,但是我很难想出一个带有子范围的算法。有人能引导我朝正确的方向发展吗?如果有的话,我不想使用内置函数等任何快捷方式。我也用python编写代码。
import random
numOfTimes = int(raw_input())
counter = 0
while counter < numOfTimes:
chance = random.randint(1,8)
if chance == 1:
randomNumber = random.randint(1,25)
if chance == 2 or 3 or 4 or 5:
randomNumber = random.randint(26,50)
if chance == 6 or 7:
randomNumber = random.randint(51,75)
if chance == 8:
randomNumber = random.randint(76,100)
counter = counter + 1
print randomNumber
答案 0 :(得分:3)
哎呀修复了我的拼写错误for i,v,r in en...
应该是for i,(v,r) in enum...
import random
key = random.random()
for i,(v,r) in enumerate(zip([.125,.625,.875],[(1,25),(26,50),(51,75)])):
if key <= v:
return random.randint(*r)
return random.randint(76,100)
类似的东西?
关于你的问题
if chance == 2 or 3 or 4 or 5: #this wont work
randomNumber = random.randint(26,50)
if chance == 6 or 7: #neither will this
randomNumber = random.randint(51,75)
这两个都是真的
chance == 2
将为True
或False
,我们将假设为False并直接放入False
if 3
与if bool(3)
相同, ANY 的数字始终为True
非零,因此我们将替换3
4
和5
True
您可以通过if False or True or True or True:
你想要像
这样的东西if chance == 2 or chance == 3 or chance == 4 or chance == 5:
可以改写为
if chance in [2,3,4,5]:
或
if 2 <= chance <= 5:
答案 1 :(得分:0)
为什么不从8个数字中抽取然后从25?再次绘制?
第一次抽奖将决定你选择的一百个数字中的哪一个。像这样:
n = random.randint(1, 8)
res = random.randint(1, 25)
if n == 1: pass
elif 2<=n<=5: res += 25
elif 6<=n<=7: res += 50
else: res +=75
return res