python生成带子范围的随机数

时间:2014-02-19 21:50:29

标签: python

我正在尝试从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

2 个答案:

答案 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将为TrueFalse,我们将假设为False并直接放入False

if 3if bool(3)相同, ANY 的数字始终为True非零,因此我们将替换3 45 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