提问人:harjon 提问时间:8/22/2022 最后编辑:Sam Masonharjon 更新时间:8/22/2022 访问量:225
具有特定数量 1 的二进制随机数
Binary random number with a specific number of ones
问:
我希望将 1 随机插入到二进制数中,其中每组特定位都有固定数量的 1。 例如,如果我有一个 15 位数字,则所有 3 组 5 位必须正好有 3 个 1。我需要生成 40 个这样的唯一二进制数。
import numpy as np
N = 15
K = 9 # K zeros, N-K ones
arr = np.array([0] * K + [1] * (N-K))
np.random.shuffle(arr)
这是我发现的,但问题是,在这里,这个解决方案意味着没有必要以我想要的方式分发 - 通过这个解决方案,所有 1 都可以在一开始就组合在一起,这样最后一组 5 位都是零 - 这不是我要找的。
此外,此方法并不能保证我拥有的所有组合都是唯一的。
寻找有关此的任何建议。谢谢!
答:
0赞
Sam Mason
8/22/2022
#1
如果我正确理解了这个问题,你可以在 Python 中做这样的事情:
import random
def valgen():
set_bits = [
*random.sample(range(0, 5), 3),
*random.sample(range(5, 10), 3),
*random.sample(range(10, 15), 3),
]
return sum(1<<i for i in set_bits)
即在每个块中采样三组整数值,无需替换,并在结果中设置这些位。
如果你想要 40 个唯一值,我会这样做:
vals = {valgen() for _ in range(40)}
while len(vals) < 40:
vals.add(valgen())
请参阅生日问题,了解为什么您应该期望每组 40 个重复项大约一个重复项
评论
0赞
harjon
8/22/2022
这是目的,谢谢!我想知道如果位数超过 50,并且我需要的值数是 1000 的倍数,这是否仍然是一种有效的方法?
0赞
Sam Mason
8/22/2022
你可以在循环中放置一个语句,看看它何时被发现重复。这将显示有多少被拒绝。你还没有很准确地知道你的 50 指的是什么数字。一般来说,你要大致计算出有多少种可能的组合,然后看看这与你想要得到的组合有多接近。当你想要超过总组合的一半时,你几乎可以肯定最好只生成所有内容,然后返回一个适当的子集。生日问题页面对此进行了一些描述print("duplicate found")
while
评论