请考虑以下代码:
def xorHash(n):
mask = random.getrandbits(32)
def xorIt(x):
return (hash(x) ^ mask) % n
return xorIt
这将返回一个随机哈希函数,该函数将元素映射到{0,1,...,rng-1}中的数字。
我想创建一个随机散列函数,将每个元素映射到{0,1,...,rng-1}中的k
元素中(不重复)。上面的例子为k = 1做了工作。
创建随机散列函数的最有效方法是什么,该函数返回{0,1,...,rng-1}的k大小的随机子集?
答案 0 :(得分:1)
使用数据的普通整数值随机散列对RNG进行种子处理,并使用它从所需范围中绘制随机样本:
def generate_randomized_set_valued_hash_function(n, k):
hashfunc = generate_randomized_hash_function()
def set_valued_hashfunc(x):
rng = random.Random(hashfunc(x))
return set(rng.sample(xrange(n), k))
return set_valued_hashfunc
您选择的RNG和整数值散列函数取决于您需要集值散列函数的强度和速度。
答案 1 :(得分:0)
如果范围相对较小,则可以创建项目数组。 你可以通过随机生成一个随机的方式对项目进行随机化,然后将第一个项目与生成的数字进行交换。
如果您的范围相对较大,您可以在整个范围内生成数字,如果您获得的项目不是唯一的,请再试一次。
顺便说一句,您的代码存在一个问题,即您的数字可能不是统一分布的,因为您使用的是%运算符。提醒技术会为小数字创建偏差,您可以在以下帖子中阅读更多内容: