You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成满足分块固定1数量的唯一随机二进制数?

解决方案

核心思路

  1. 先生成所有单个符合要求的比特组:比如5位长度的组里恰好有3个1,通过枚举1的位置来生成所有可能的合法组合
  2. 每次随机挑选对应数量的合法组拼接成完整二进制数
  3. 用集合记录已生成的结果,利用集合的唯一性自动去重,直到收集到目标数量的唯一值

代码实现

import random
import itertools

# 配置参数
total_bits = 15          # 总二进制位数
group_length = 5         # 每个比特组的长度
ones_per_group = 3       # 每个组内必须包含的1的数量
required_count = 40      # 需要生成的唯一二进制数数量

# 生成所有合法的单个比特组
def get_valid_groups(group_len, ones_count):
    # 枚举所有可能的1的位置组合
    one_positions = itertools.combinations(range(group_len), ones_count)
    valid_groups = []
    for positions in one_positions:
        group = [0] * group_len
        for idx in positions:
            group[idx] = 1
        # 转成元组,方便存入集合(列表不可哈希)
        valid_groups.append(tuple(group))
    return valid_groups

# 获取所有符合要求的单个分组
all_valid_groups = get_valid_groups(group_length, ones_per_group)
# 计算需要多少个分组组成完整二进制数
group_count = total_bits // group_length

# 存储唯一的二进制序列(用元组存储,保证可哈希)
unique_sequences = set()

# 生成直到满足数量要求
while len(unique_sequences) < required_count:
    # 随机选group_count个合法分组,拼接成完整序列
    selected = random.sample(all_valid_groups, group_count)
    full_seq = tuple(bit for group in selected for bit in group)
    unique_sequences.add(full_seq)

# 可选:将结果转为字符串格式便于查看
final_results = [''.join(map(str, seq)) for seq in unique_sequences]

# 打印几个示例
for i, seq in enumerate(final_results[:5], 1):
    print(f"示例{i}: {seq}")

关键细节说明

  • 合法分组生成:用itertools.combinations枚举所有1的位置,确保每个组严格符合"恰好N个1"的要求,从根源避免了原方法中1集中的问题
  • 去重机制:集合会自动忽略重复的序列,确保生成的所有二进制数都是唯一的
  • 效率保障:本例中单个分组有C(5,3)=10种可能,3个分组组合总共有1000种合法序列,远大于需要的40个,因此很快就能收集到足够的唯一值

内容的提问来源于stack exchange,提问作者harjon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:48:25