python - 使用 itertools 产品生成随机数

标签 python random python-itertools

我正在使用生成器函数在 itertools.product 旁边创建有序的数字列表,以便创建所述数字的所有可能配对:

def gen(lowerBound, upperBound, stepSize = 1):
    for steppedVal in np.arange(lowerBound, upperBound, stepSize):
        yield steppedVal

for vectors in it.product(gen(3,6), gen(10,30,5)):
    print(vectors)

这正如预期的那样产生了这样一个数据集:

(3, 10)
(3, 15)
(3, 20)
(3, 25)
(4, 10)
(4, 15)
(4, 20)
(4, 25)
(5, 10)
(5, 15)
(5, 20)
(5, 25)

但是我的问题在于下一步。我想向生成器函数添加一个子句以使用范围内的随机数而不是步进值。当我尝试以下操作时:

def gen(useRandom, lowerBound, upperBound, stepSize = 1):
    if useRandom:
        randomVal = random.uniform(lowerBound, upperBound)
        yield randomVal
    else:
        for steppedVal in np.arange(lowerBound, upperBound, stepSize):
            yield steppedVal

for vectors in itertools.product(gen(True,3,6), gen(False,10,30,5)):
    print(vectors)

我明白了,这不是我想要的:

(4.4163620543645585, 10)
(4.4163620543645585, 15)
(4.4163620543645585, 20)
(4.4163620543645585, 25)

我如何修改此代码,以便此数据集中的每个随机数都是唯一的,而不必在事后更改数据集,因为这会增加巨大的计算开销。 (实际数据集包含十几个变量,每个变量有 10-20 个步骤)。

编辑,为了澄清这里是所需的输出:

(4.1802347587349857, 10)
(3.7128578913746897, 15)
(5.8912734809721957, 20)
(4.4163620543645585, 25)

编辑 2,为了更加清楚,我不想使用 zip 函数,因为这也应该是一个可能的输出:

for vectors in itertools.product(gen(True,3,6), gen(False,10,30,5), gen(False,5,10):
    print(vectors)

(Some Random Number, 10, 5)
(Some Random Number, 10, 6)
(Some Random Number, 10, 7)
(Some Random Number, 10, 8)
(Some Random Number, 10, 9)
(Some Random Number, 15, 5)
(Some Random Number, 15, 6)
(Some Random Number, 15, 7)
(Some Random Number, 15, 8)
(Some Random Number, 15, 9)
(Some Random Number, 20, 5)
(Some Random Number, 20, 6)
(Some Random Number, 20, 7)
(Some Random Number, 20, 8)
(Some Random Number, 20, 9)
(Some Random Number, 25, 5)
(Some Random Number, 25, 6)
(Some Random Number, 25, 7)
(Some Random Number, 25, 8)
(Some Random Number, 25, 9)

关键部分是第二个和第三个生成器的每一对仍然存在。

最佳答案

您的生成器只调用一次 random.uniform。我想你想要:

def gen(useRandom, lowerBound, upperBound, stepSize = 1):
    for steppedVal in np.arange(lowerBound, upperBound, stepSize):
        if useRandom:
            randomVal = random.uniform(lowerBound, upperBound)
            yield randomVal
        else:
            yield steppedVal

现在,您的输出变为:

(4.229914739995998, 10)
(4.229914739995998, 15)
(4.229914739995998, 20)
(4.229914739995998, 25)
(5.52362641577289, 10)
(5.52362641577289, 15)
(5.52362641577289, 20)
(5.52362641577289, 25)
(4.507985392309242, 10)
(4.507985392309242, 15)
(4.507985392309242, 20)
(4.507985392309242, 25)

这表明您获得了三个不同的随机值,对应于生成器第一个实例运行的三次。

另外请注意,您可能需要查看 random.randrange,它实际上从 range(lowerBound, upperBound, stepSize) 返回一个随机整数。如果您在生成器函数中将 random.uniform(lowerBound, upperBound) 替换为 random.randrange(lowerBound, upperBound, stepSize),您将获得输出:

(5, 10)
(5, 15)
(5, 20)
(5, 25)
(3, 10)
(3, 15)
(3, 20)
(3, 25)
(3, 10)
(3, 15)
(3, 20)
(3, 25)

这一次,生成器在每次迭代中从集合 [3,4,5] 中选择一个随机数。请注意,这不一定会在每次迭代中产生唯一的数字!如果您正在寻找,您可以使用 random.shuffle

关于python - 使用 itertools 产品生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50610112/

相关文章:

python - python 中大小为 150 000 的数组的内存错误

python - 为什么我无法获取 itertool.product 中的长度? Python 3.6

python - 使用 HDF5 格式将 pandas 数据帧写入 S3

C# 随机数生成器陷入循环

java - 为什么 Random 类不是静态的?

python - 循环滑动窗口迭代

python - 如何在导入的模块之间共享全局变量?

python - 从带有行和列标题的 csv 文件中读取 networkx 图

python - 如何仅在 z3 中解决此问题

java - 如何比较两个具有随机构造函数的对象