Algorithm 从集合中2个数字的组合生成非冲突随机数?

Algorithm 从集合中2个数字的组合生成非冲突随机数?,algorithm,data-structures,language-agnostic,statistics,bits,Algorithm,Data Structures,Language Agnostic,Statistics,Bits,我有一组长度>=2的64位无符号整数。我从那个集合中选择了两个随机整数,a,b。我应用确定性运算将a和b组合成不同的64位无符号整数、c_1、c_2、c_3,等等。我将这些c_ns添加到集合中。我重复这个过程 我可以使用什么程序来保证c几乎不会与集合中的现有位字符串发生冲突,即使经过数百万步?我认为,在没有任何其他给定约束的情况下,最好使用伪随机函数,将两个64位整数映射为一个64位整数。根据a和b的顺序是否与您的问题有关(即(3,5)应该映射到(5,3)之外的其他内容),您不应该或应该在之前对

我有一组长度>=2的64位无符号整数。我从那个集合中选择了两个随机整数,
a
b
。我应用确定性运算将
a
b
组合成不同的64位无符号整数、
c_1
c_2
c_3
,等等。我将这些
c_ns
添加到集合中。我重复这个过程


我可以使用什么程序来保证
c
几乎不会与集合中的现有位字符串发生冲突,即使经过数百万步?

我认为,在没有任何其他给定约束的情况下,最好使用伪随机函数,将两个64位整数映射为一个64位整数。根据
a
b
的顺序是否与您的问题有关(即
(3,5)
应该映射到
(5,3)
之外的其他内容),您不应该或应该在之前对它们进行排序

将较大输入映射到较小输入的伪随机函数的自然选择是哈希函数。您可以选择任何产生至少64位输出的哈希函数并将其截断。(在这种情况下,我最喜欢的是使用任意固定密钥,它速度快,有多种语言的公共域实现,但您可以使用任何可用的密钥。)

在发生碰撞之前可以生成的预期数量由确定,因为您基本上是随机选择值。链接文章包含64位值的概率表。例如,如果生成约600万个条目,则碰撞概率为百万分之一


我认为在一般情况下不可能击败这种方法,因为您可以在组合的元素序列中编码任意数量的信息,而输出值中的信息量固定为64位。因此,你必须考虑碰撞,随机函数在所有可能的序列中均匀地分布概率。

< P>我认为,在没有任何其他给定约束的情况下,最好的方法是使用将两个64位整数映射到64位整数的伪随机函数。根据
a
b
的顺序是否与您的问题有关(即
(3,5)
应该映射到
(5,3)
之外的其他内容),您不应该或应该在之前对它们进行排序

将较大输入映射到较小输入的伪随机函数的自然选择是哈希函数。您可以选择任何产生至少64位输出的哈希函数并将其截断。(在这种情况下,我最喜欢的是使用任意固定密钥,它速度快,有多种语言的公共域实现,但您可以使用任何可用的密钥。)

在发生碰撞之前可以生成的预期数量由确定,因为您基本上是随机选择值。链接文章包含64位值的概率表。例如,如果生成约600万个条目,则碰撞概率为百万分之一


我认为在一般情况下不可能击败这种方法,因为您可以在组合的元素序列中编码任意数量的信息,而输出值中的信息量固定为64位。因此,你必须考虑碰撞,随机函数在所有可能的序列中均匀地分布概率。

< P>因为你从一对64位数字中产生多个64位值,我建议你随机选择两个数字,并使用它们初始化具有128位状态的64位xorshift随机数生成器。有关示例,请参见

但是,当您使用多个随机数生成器时,很难预测碰撞概率。对于单个PRNG,经验法则是,在生成范围的平方根后,发生碰撞的几率为50%。例如,如果您正在生成32位随机数,那么在生成大约70000个数字后,碰撞概率将达到50%。2^32的平方根是65536

使用单个64位PRNG,您可以生成超过10亿个随机数,而不必太担心冲突。在您的例子中,您从一个可能较小的池中选取两个数字,然后初始化一个PRNG并生成一个相对较少的值,然后将其添加回池中。在那种情况下,我不知道如何计算碰撞概率


然而,请注意,无论碰撞的概率如何,碰撞的可能性始终存在。事实上,“十亿分之一”的机会确实存在:平均每运行程序十亿次就有一次。最好将输出数字保存在哈希集或其他不允许存储重复数据的数据结构中。

由于要从一对64位数字生成多个64位值,我建议您随机选择两个数字,并使用它们初始化具有128位状态的64位xorshift随机数生成器。有关示例,请参见

但是,当您使用多个随机数生成器时,很难预测碰撞概率。对于单个PRNG,经验法则是,在生成范围的平方根后,发生碰撞的几率为50%。例如,如果您正在生成32位随机数,那么在生成大约70000个数字后,碰撞概率将达到50%。2^32的平方根是65536

使用单个64位PRNG,您可以生成超过10亿个随机数,而不必太担心冲突。在您的例子中,您从一个可能较小的池中选取两个数字,然后初始化一个PRNG并生成一个相对较少的值,然后将其添加回池中。我不