Optimization 从集合中快速选择位

Optimization 从集合中快速选择位,optimization,language-agnostic,montecarlo,Optimization,Language Agnostic,Montecarlo,我想从已知的位掩码中选择一些随机位。理想情况下,我也希望以随机顺序选择这些位,但稍后可以将任务分为选择和洗牌 数据的一些附加特征: 位掩码的长度为64位 所选位数为4、8、16或32 通常将设置40到60位(始终至少设置一半) 我需要为单个位掩码提供数百万个随机选择(结果用于统计模拟) 下面是一个掩码示例和我期望的东西(随机选择4位): 在本例中,我不应该返回位位置0,因为它已被禁用 这是该算法的一个已知热点,因此我希望尽可能多地利用它的性能(对随机选择的测试只需要比我当前的随机选择实现长约

我想从已知的位掩码中选择一些随机位。理想情况下,我也希望以随机顺序选择这些位,但稍后可以将任务分为选择和洗牌

数据的一些附加特征:

  • 位掩码的长度为64位
  • 所选位数为4、8、16或32
  • 通常将设置40到60位(始终至少设置一半)
  • 我需要为单个位掩码提供数百万个随机选择(结果用于统计模拟)
下面是一个掩码示例和我期望的东西(随机选择4位):

在本例中,我不应该返回位位置0,因为它已被禁用

这是该算法的一个已知热点,因此我希望尽可能多地利用它的性能(对随机选择的测试只需要比我当前的随机选择实现长约2倍)。我目前的想法是用位掩码中设置的位位置填充
字符位置[64]
中的第一个
n
数字。因此,对于上面的示例,我将以:
[1,2,3,4,5,6,8,9,…]
结束。然后开始在
0
n
之间选择随机数以选择随机位位置。每次选择后,将位置设置为-1,如果我再次点击-1,则重复随机选择

这对于选择4个数字很好,但在选择32个数字时,重复选择的次数太多

另一个想法是创建一个如上所述的位置数组,然后使用Fisher–Yates将其洗牌,然后选择第一个
n
位置。这需要在数组中进行更多的写入,并且始终需要生成与设置位数量相同的随机数,这对于仅选择4位来说可能是一种过度杀伤力

有没有更快的方法生成这些数据?我的目标是模拟的准确性,所以这实际上是关于我可以在一秒钟内检查多少个随机迭代


语言其实并不重要,但我想C语言将在这里占据主导地位。

你不必做一个完整的费舍尔·耶茨洗牌。在获得第一个
n
值后,只需停止即可。您甚至可以在下一个示例中重用部分无序排列的数组。以下是C99中的一个示例:

#包括
#包括
#包括
//假设数组a包含任意顺序的数字0..63
静态无效打印随机位(uint64位掩码,整数位,整数a[64]){
for(int i=0,j=63;iprintf(“随机位%2d:%d\n”、t、位掩码和(1如果需要,我会首先尝试使用它)
mask    0111111011111011111110111111111111111101111111100111101111111111
random4 ....1...........1........1...............1......................
shuffled bit positions: 41, 16, 4, 25