【发布时间】:2018-11-29 13:20:38
【问题描述】:
假设我有一个 64 位无符号整数 (u64) mask,设置了一位或多位。
我想从m 中随机均匀地选择一个设置位,以提供一个新掩码x,这样x & mask 就设置了一个位。执行此操作的一些伪代码可能是:
def uniform_random_bit_from_mask(mask):
assert mask > 0
set_indices = get_set_indices(mask)
random_index = uniform_random_choice(set_indices)
new_mask = set_bit(random_index, 0)
return new_mask
但是我需要尽可能快地执行此操作(与上面类似的低级语言代码正在减慢热循环)。有没有人有更有效的方案?
【问题讨论】:
-
如果您只能获得number of set bits efficiently,那么您就不必创建索引列表。
-
是的,获取设置位的数量更便宜 - 但我仍然需要在最终掩码中设置位,所以我需要索引?
-
随机函数应该只是告诉你翻转第 i 位,所以你实际上不需要跟踪列表,但我相信你仍然需要遍历这些位。但是,
rand()函数不是这里的真正瓶颈吗? -
如果您认为可以优化,也许您可以说明实际问题。现在我会说这些优化会给你不到 1% 的速度提升(尽管分析会给你准确的值)。
-
@hellow 我假设 OP 想要一个 Rust 的答案,而 Pythonish 伪代码只是为了说明。
标签: random rust statistics bit-manipulation