伪随机数发生器,固定密度为1s

时间:2010-01-13 22:28:07

标签: random

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

有人可以说明这一点或给我另一种方式吗?

...谢谢

3 个答案:

答案 0 :(得分:0)

编辑: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

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

    <击>
  1. 生成随机事实数字N,直到您的位深度。
  2. 将factoradic转换为permutation index-list
  3. 将您的排列列表转换为位数组(在伪python中说明):

    [x&lt; wt for x in perm_list]

答案 1 :(得分:0)

我没有听说过使用LCG产生一个固定的汉明重量(我在学校没有深入汉明码,所以我也不会太惊讶:)。

在任何情况下,生成具有固定汉明权重的一堆比特都相当简单。这里有一些python代码会返回一个具有特定权重的 n 位数。这应该很容易转换成其他语言(除了python整数任意大的事实)。

from random import randrange

def get_ham_and_bits(weight, nbits=32):
    "Get n-bits with a fixed hamming weight"
    if weight > nbits: 
        return 1 < nbits

    result = 0
    for i in xrange(weight):
        bit = 1 << randrange(nbits)

        # only flip bits that aren't already flipped. delete the loop to
        # make this return a random weight instead of a fixed weight
        while bit & result != 0: 
            bit = 1 << randrange(nbits)

        # An XOR might be a better idea here, especially if you remove the loop.
        result |= bit
    return result

答案 2 :(得分:0)

使用伪随机数生成器(PRNG),即使是一个具有低权重种子的简单生成器也绝对不是一个好的解决方案。 PRNG不保持种子的汉明重量不变,PRNG的整个想法是删除种子的信息。

如果您希望将exacly位设置为n中的1,则您的问题是these two个问题的变体。如果k远小于n,则改组解是O(n)。我认为以下解决方案是O(k)。

它基于this answer,在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))

如果你想要将大约k比特设置为1,其中k / n是每个比特为1的概率,那么你必须看看伯努利和几何分布。