Random 固定密度1s的伪随机数发生器

Random 固定密度1s的伪随机数发生器,random,Random,我正在寻找生成伪随机数的方法[可能是低“随机性”]或 具有固定汉明权重[1s固定密度]的伪随机比特序列。 我发现了一些关于使用一个简单的线性同余生成器的建议,该生成器的种子具有我需要的汉明权重,但没有给出为什么这是正确的理由[为什么汉明权重在线性同余变换下是不变的] 有谁能解释这一点或给我另一种方法吗 谢谢…编辑:python可以轻松地洗牌 from random import shuffle def gen(ham, bits=32): # generate a list with

我正在寻找生成伪随机数的方法[可能是低“随机性”]或 具有固定汉明权重[1s固定密度]的伪随机比特序列。 我发现了一些关于使用一个简单的线性同余生成器的建议,该生成器的种子具有我需要的汉明权重,但没有给出为什么这是正确的理由[为什么汉明权重在线性同余变换下是不变的]

有谁能解释这一点或给我另一种方法吗

谢谢…

编辑:python可以轻松地洗牌

from random import shuffle

def gen(ham, bits=32):
    # generate a list with the correct number of 1's
    x = [1]*ham+[0]*(bits-ham)
    shuffle(x)
    # convert back to a number
    return int(''.join(map(str,x)),2)

>> print('\n'.join(bin(gen(5,15)) for x in range(10)))
0b101100100001000
0b100110010010
0b100110110000000
0b10010101100
0b11101100000
0b100100001000110
0b10000010101001
0b110000011100000
0b100011100010
0b100000011100010

下面是一种可能的方法(基本上,生成基字符串的随机排列):

  • 生成一个随机的factoradic数N,直到您的位深度
  • 将factoradic转换为置换索引列表
  • 将排列列表转换为位数组(如伪python所示):


    [x我还没有听说过使用LCG来生成固定的汉明权重(我在学校没有深入研究汉明码,所以我也不太惊讶:)

    在任何情况下,生成一组具有固定汉明权重的位都是相当简单的。下面是一段python代码,它将返回一个具有特定权重的n位数字。这也应该很容易翻译成其他语言(除了python整数任意大的事实)

    来自随机导入范围
    def get_ham_和_位(重量,nbits=32):
    “获取具有固定汉明权重的n位”
    如果重量>nbits:
    返回1bit=1使用伪随机数生成器(PRNG),即使是一个具有低权重种子的简单生成器,也绝对不是一个好的解决方案。PRNG不会保持种子的汉明权重不变,PRNG的整个思想是删除种子的信息

    如果你想将n中的exacly bits设置为1,你的问题是问题的一个变体。如果k比n小很多,洗牌解是O(n)。我认为下面的解是O(k)

    它是基于python的

    from random import sample
    
    def konesoutofn(k, n):
        output=0
        for d in sample(xrange(n), k):output+=(1<<d)
        return output
    
    x=konesoutofn(4,32)
    print(bin(x))
    
    来自随机导入样本
    def KonesAutofn(k,n):
    输出=0
    对于示例中的d(xrange(n),k):输出+=(1也请参见。要求略有不同,但您可能会发现一些代码很有用。
    
    from random import sample
    
    def konesoutofn(k, n):
        output=0
        for d in sample(xrange(n), k):output+=(1<<d)
        return output
    
    x=konesoutofn(4,32)
    print(bin(x))