当前位置:  开发笔记 > 编程语言 > 正文

生成随机数的算法

如何解决《生成随机数的算法》经验,为你挑选了3个好方法。

我希望生成一个随机数并将其发布到数据库中的表中,以用于特定的user_id.问题是,相同的数字不能使用两次.有一百万种方法可以做到这一点,但我希望非常热衷于算法的人能够在一个优雅的解决方案中巧妙地解决问题,因为满足以下条件:

1)对数据库的查询量最少.2)在内存中进行数据结构爬行的次数最少.

基本上这个想法是做以下事情

1)创建0到9999999之间的随机数
2)检查数据库以查看数字是否存在
或者
2)查询数据库中的所有数字
3)查看返回的结果是否与数据库中的数据匹配
4)如果匹配,重复步骤1,如果没有,问题就解决了.

谢谢.



1> Robert Gould..:

没有你的算法不可扩展.我之前做的是串行发送数字(每次+1),然后通过XOR操作传递它们来混杂位,从而给我一个看似随机的数字.当然它们并不是随机的,但它们看起来对用户来说是如此.


[编辑]补充资料

这个算法的逻辑是这样的,你使用一个已知的序列来生成唯一的数字,然后你确定地操纵它们,所以它们不再看起来是连续的.一般的解决方案是使用某种形式的加密,在我的例子中是一个XOR触发器,因为它的速度尽可能快,并且它可以保证数字永远不会碰撞.

但是,您可以使用其他形式的加密,如果您想要更加随机的数字,超速(假设您不需要一次生成多个ID).现在,选择加密算法的重点是"数字绝不会碰撞的保证".并且证明加密算法是否能够实现该保证的方法是检查加密的原始数量和结果是否具有相同的比特数,并且该算法是可逆的(双射).

[感谢Adam LissCesarB对解决方案的研究]


容易证明:如果原始数字和加密结果都具有相同的位数,为了使算法可逆,它必须是双射(否则在其中一个方向上会发生冲突).因此,它只需要是可逆的并且具有相同的位数.
是加密工作,实际上XOR是一种"廉价"加密形式,它保证永远不会发生碰撞.使我的解决方案成为更通用解决方案的特例,但您需要证明另一个加密是否可以在安全使用之前提供相同的保证.

2> Claudiu..:

你为什么不使用GUID?大多数语言应该有内置的方法来执行此操作.它保证是唯一的(具有非常合理的界限).


@rjmunro:如果你做一点检查,你会发现它们根本不是随机的,它们可能看起来如此,但不是随机设计的,它们的设计是独一无二的.

3> Oddthinking..:

想要一个过顶的解决方案?

我认为随机性不是加密质量,而是足以阻止用户通过user_id猜测用户的寿命.

在开发期间,以字符串形式生成所有1000万个数字的列表.

(可选)执行一些简单的转换,例如向中间添加常量字符串.(这是为了防止结果过于可预测.)

将它们传递给生成Perfect Hash函数的工具,例如gperf.

生成的代码可用于在运行时将用户的id快速编码为唯一的哈希值,保证不与任何其他哈希值冲突.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有