Python 确保所有2**N组合以N个布尔值的M个随机输出生成

Python 确保所有2**N组合以N个布尔值的M个随机输出生成,python,numpy,random,Python,Numpy,Random,在下面的示例中,M=10和N=2,并且由于M远大于2**N,因此概率是,在本示例中,N个布尔值(真、真、(真、假)、(假、真)、(假、假)的每个可能组合将在M个输出中至少生成一次,如下所述 for _ in range(10): ... choice1 = np.random.choice((True, False)) ... choice2 = np.random.choice((True, False)) ... print(choice1, choice2) ...

在下面的示例中,M=10和N=2,并且由于M远大于2**N,因此概率是,在本示例中,N个布尔值(真、真、(真、假)、(假、真)、(假、假)的每个可能组合将在M个输出中至少生成一次,如下所述

for _ in range(10):
...     choice1 = np.random.choice((True, False))
...     choice2 = np.random.choice((True, False))
...     print(choice1, choice2)
...     
False False
False False
True False
True False
True True
False True
True True
True True
True False
False False
但这并不能保证。获得10 X(假,假)或10 X(真,真)的概率很低,或者可能是一对特定组合(比如假,真)从未出现的情况

在“现实生活”中,打印内容被收益率报表取代,
choice1
choice2
伴随着其他几个随机生成的数字变量

我如何轻松地更改
选项1
选项2
的生成,以确保它们始终覆盖所有4种可能性,同时仍然保持(大部分)随机性,而不只是添加4个额外的非随机情况来强制发生


我觉得可以利用“选择而不替换”选项,但我想不出如何合并此选项。

如果您想确保在leat中使用每个可能的组合,那么您可以首先创建一个包含所有可能组合的列表,然后随机弹出(拾取并删除)一个元素。当列表为空时,您可以重新创建它

缺点是不能在弹出的所有元素之前两次获得相同的元素

以下代码似乎可以完成此任务:

随机导入
导入副本
来自itertools进口产品
M=10
N=2
#首先生成所有可能的组合:
所有组合\u ref=产品([正确,错误],重复=N)
所有组合=列表(复制。复制(所有组合参考))
#现在随机弹出一个元素:
对于范围内的i(M):
如果len(所有_组合)==0:
所有组合=列表(复制。复制(所有组合参考))
打印(所有组合.pop(random.randint(0,len(所有组合)-1)))

希望这会对您有所帮助。

如果您想确保在leat中使用每个可能的组合,您可以先创建一个包含所有可能组合的列表,然后随机弹出(拾取并删除)一个元素。当列表为空时,您可以重新创建它

缺点是不能在弹出的所有元素之前两次获得相同的元素

以下代码似乎可以完成此任务:

随机导入
导入副本
来自itertools进口产品
M=10
N=2
#首先生成所有可能的组合:
所有组合\u ref=产品([正确,错误],重复=N)
所有组合=列表(复制。复制(所有组合参考))
#现在随机弹出一个元素:
对于范围内的i(M):
如果len(所有_组合)==0:
所有组合=列表(复制。复制(所有组合参考))
打印(所有组合.pop(random.randint(0,len(所有组合)-1)))

希望这能对你有所帮助。

这个答案正是我想要的。它没有来自R Liab的一个缺点,尽管这有助于——谢谢——导出这个

import numpy as np
from itertools import product

N = 2
M = 10
possibles = product((True, False), repeat=N)

selection_pool = list(possibles)
not_yet_used = set(selection_pool)
m2go = M

while m2go > 0:
    if m2go <= len(not_yet_used):
        selection_pool = list(not_yet_used)
    used = selection_pool[np.random.choice(len(selection_pool))]
    not_yet_used.discard(used)
    print(*used)
    m2go -= 1
将numpy导入为np
来自itertools进口产品
N=2
M=10
可能性=产品((真,假),重复=N)
选择池=列表(可能)
尚未使用=设置(选择池)
m2go=M
当m2go>0时:

如果m2go这个答案正是我想要的。它没有来自R Liab的一个缺点,尽管这有助于——谢谢——导出这个

import numpy as np
from itertools import product

N = 2
M = 10
possibles = product((True, False), repeat=N)

selection_pool = list(possibles)
not_yet_used = set(selection_pool)
m2go = M

while m2go > 0:
    if m2go <= len(not_yet_used):
        selection_pool = list(not_yet_used)
    used = selection_pool[np.random.choice(len(selection_pool))]
    not_yet_used.discard(used)
    print(*used)
    m2go -= 1
将numpy导入为np
来自itertools进口产品
N=2
M=10
可能性=产品((真,假),重复=N)
选择池=列表(可能)
尚未使用=设置(选择池)
m2go=M
当m2go>0时:
如果你去