具有特定数量 1 的二进制随机数

Binary random number with a specific number of ones

提问人:harjon 提问时间:8/22/2022 最后编辑:Sam Masonharjon 更新时间:8/22/2022 访问量:225

问:

我希望将 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赞 john 8/22/2022
我认为你必须更好地解释这个看似矛盾的问题。所有 3 组 5 位必须正好有 3 个 1。最后一组 5 位相比,都是零
0赞 Bathsheba 8/22/2022
可能的数字集是否合理小?
1赞 matszwecja 8/22/2022
@john“最后一组 5 位都是零”是描述当前不需要的行为。
1赞 463035818_is_not_an_ai 8/22/2022
请注意,语言标签适用于特定于该语言的查询。也许你不在乎它是 python 还是 C++,但未来寻找它们中的任何一个的读者可能会找到一个带有 C++ 答案的 python 问题,并且不会对此感到高兴。
0赞 Michael Butscher 8/22/2022
在每个组中设置一个并分别随机播放每个组。删除重复的结果并用新生成的数字替换它们(理论上可以创建一个无限循环,但实际上应该有效)。

答:

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