【发布时间】:2015-10-27 20:12:58
【问题描述】:
我想这是我关于 SO 的第一个问题。
我目前正在开发一个网站,我必须为彩票生成 1 到 29 之间的 6 个数字(每个数字最多一个)。因为它们可以按任何顺序排列,所以我只是在之后对它们进行排序。
如果我没记错的话,应该是(29*28*27*26*25*24) / 6! = 475020有不同的可能组合。
我尝试了不同的方法来生成序列,或者使用 mt_rand 或 random_int(来自 random_compat)但是当我用类似 10k 的迭代测试它时,我总是得到大约 100 个重复,即使它们是 465k 组合仍然可用。
这是我一直在尝试的代码示例:
// Using an array and mt_rand (or random_int, giving same results)
// Also tried shuffling the array instead of simply reindexing it, not better
$values = range(1, 29);
while(count($values) > 6) {
unset($values[mt_rand(0, count($values) - 1)]);
$values = array_values($values);
}
// Creating the array from random numbers (same results using random_int)
$values = array();
while (count($values) < 6) {
$r = mt_rand(1, 29);
if (in_array($r, $values)) {
continue;
} else {
$values[] = $r;
}
}
好吧...我的问题是:
- 有没有办法改进我目前正在做的事情?
- 会不会是这样,我必须处理它?
- 我只是做错了吗?
谢谢!
林恩。
PS : 看了很多问题,但没有找到任何满足我需求的东西,如果我看起来不够好,请见谅!
只是为了澄清一些事情:使用 random_int(它使用 /dev/urandom 或 openssl_random_pseudo_bytes)并没有改善任何东西,我认为这会改善。如果可能的话,我不想使用任何外部 API(如 random.org)。
【问题讨论】:
-
$numbers = range(1,29); shuffle($range); $draw = array_slice($range, 0, 6); echo implode(',' $draw);.... 在任何给定的平局中,您永远不会得到任何重复 -
@MarkBaker implode方法的参数顺序错误。
-
@MarkBaker 我没有在特定抽奖中得到重复,我得到重复抽奖。抱歉,如果不够清楚:)
-
@MeneerVenus 不,它们的顺序正确,但缺少逗号。接受其他参数顺序但不推荐:php.net/manual/en/function.implode.php
-
@Lynesth 哦,我还以为是致命错误,结果发现缺少逗号,而
$numbers变量应该被称为$range。