PHP随机不重复的数(自定义,以随机大乐透举例)

说白了,PHP 生成彩票式的随机数。
关键是要保证前面的1 到3 5 的五个数字和后面的1 到1 2 的两个数字不重叠。
由于它必须是随机且唯一的,这一事实使情况变得复杂。

首先直接使用mt_rand提取。
例如,当我去年运行该项目时,使用 array_flip(array_flip($temp)) 直接删除权重比 array_unique 快约 3 0%。
还有一点是,抽奖后你必须将前五个数字洗牌。
否则顺序就会太固定。
例如,以 3 5 开头的乐透号码特别难中奖。
还有一点很重要。
最后,我们使用 str_replace 删除爆破留下的逗号。
否则,输出将类似于“1 ,2 ,3 ,4 ,5 +1 ,2 ”,这会误导用户。

一开始我认为使用 while 循环来检查迭代是最安全的,但后来我发现 range($start,$end) 与 array_slice 结合可以一步完成,效率更高。
等等,还有一件事。
如果您要求用户生成前六个数字,则需要在代码中添加一些判断。
否则$length=6 会直接崩溃。

我们建议自己使用优化后的版本,这是一个range+shuffle+slice的组合,比手动提取直观得多。
但对于内嵌PHP且内存极其有限的场景,这种方法可能运行速度并不快。

怎么用php中的random模块求随机数?

兰特函数:
生成 1 到 1 00 之间的随机数: $randomNumber = rand(1 , 1 00);
伪随机数不安全,不要使用它们。
random_int函数:
生成 1 到 1 00 之间的随机数: $randomNumber = random_int(1 , 1 00);
安全性高,适合PHP7 及以上版本。

砂的功能:
设置兰特种子:srand(1 0000);
不需要为random_int设置种子,不要盲目设置。

结论:random_int 更安全,rand 不可靠。

怎么用php中的random模块求随机数?

嘿,我真的需要谈谈 PHP 随机数的事情。
几年前我在杭州做项目时就遇到过这样的陷阱。

当时需要生成一个随机字符串作为用户的临时登录链接。
我使用 rand() 来做到这一点。
代码如下:
php $s = 兰特 ( 1 000 , 9 9 9 9 ); echo "您的临时登录名是:http://example.com/login?id=$s";
起初什么也没发生,数百名用户下车后一切都很好。
后来客户意外想要进行支付验证,并要求随机数更安全。
我查了一下,哦,PHP5 .6 下的rand()是非常随机的,很容易猜到。

这件事发生了。
后来我赶紧改成random_int()。
代码如下:
php $s = random_int (1 000, 9 9 9 9 ); echo "您的临时登录名是:http://example.com/login?id=$s";
random_int() 仅在 PHP7 中添加并生成加密安全的随机数。
使用后,客户反映验证码效果好多了,安全性也更高。

但是,如果你使用旧版本的PHP,比如2 01 5 年左右,你可能仍然需要使用rand(),但是你必须自己设置种子,否则每次重启服务器时生成的随机数都是一样的,那就尴尬了。

这就是我当时所做的:
php srand (( microtime ( true ) 1 000 )); $s = 兰特 ( 1 000 , 9 9 9 9 ); echo "您的临时登录名是:http://example.com/login?id=$s";
程序每次启动时都以当前时间的微秒数为基数,这样每次生成的随机数都是不同的。

但说实话,这个 rand() 还是没什么意义的。
后来项目升级到PHP8 的时候,我就直接使用random_int()了,简单直接。

要谈论完全安全的随机数,您需要使用 OpenSSL。
例如:
php $s = bin2 hex(openssl_random_pseudo_bytes(4 )); echo "您的临时登录名是:http://example.com/login?id=$s";
由此生成的随机字符串更加强大,适合与安全相关的操作,例如生成代码、密码重置代码等。

总结一下:在正常情况下只需使用 rand() 即可,但必须记住设置种子。
为了安全起见,请使用 random_int() 或 OpenSSL。
不要在付款验证之类的地方真正使用 rand() ,否则客户端会给你带来麻烦。
我当时就吸取了这个教训。