Использование генератора псевдослучайных чисел (PRNG), даже простого генератора с малым весом, определенно НЕ является хорошим решением. PRNG не поддерживают постоянный вес Хемминга семян, и вся идея PRNG заключается в удалении информации о семени.
Если вы хотите, чтобы биты были точно установлены в 1 из n, ваш вопрос является вариантом этих двух вопросов. Если k намного меньше, чем n, решение для перемешивания равно O (n). Я думаю, что следующее решение O (k).
Он основан на этом ответе , на питоне
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 битов, установленных в единицу, при k / n, равной вероятности того, что каждый бит равен единице, вам следует взглянуть на распределения Бернулли и Геометрические.