Random 固定密度1s的伪随机数发生器
我正在寻找生成伪随机数的方法[可能是低“随机性”]或 具有固定汉明权重[1s固定密度]的伪随机比特序列。 我发现了一些关于使用一个简单的线性同余生成器的建议,该生成器的种子具有我需要的汉明权重,但没有给出为什么这是正确的理由[为什么汉明权重在线性同余变换下是不变的] 有谁能解释这一点或给我另一种方法吗 谢谢…编辑:python可以轻松地洗牌Random 固定密度1s的伪随机数发生器,random,Random,我正在寻找生成伪随机数的方法[可能是低“随机性”]或 具有固定汉明权重[1s固定密度]的伪随机比特序列。 我发现了一些关于使用一个简单的线性同余生成器的建议,该生成器的种子具有我需要的汉明权重,但没有给出为什么这是正确的理由[为什么汉明权重在线性同余变换下是不变的] 有谁能解释这一点或给我另一种方法吗 谢谢…编辑:python可以轻松地洗牌 from random import shuffle def gen(ham, bits=32): # generate a list with
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
下面是一种可能的方法(基本上,生成基字符串的随机排列):
[x我还没有听说过使用LCG来生成固定的汉明权重(我在学校没有深入研究汉明码,所以我也不太惊讶:) 在任何情况下,生成一组具有固定汉明权重的位都是相当简单的。下面是一段python代码,它将返回一个具有特定权重的n位数字。这也应该很容易翻译成其他语言(除了python整数任意大的事实)
来自随机导入范围
def get_ham_和_位(重量,nbits=32):
“获取具有固定汉明权重的n位”
如果重量>nbits:
返回1 bit=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))