生成每月更改的随机数

时间:2017-01-25 09:12:55

标签: php random

我需要在给定范围内生成一个随机数。数字对于一年中的每个新月份必须是不同的,并且它应该与前一年在该给定月份生成的数字不同(尽管理论上可行)。

我在考虑将php rand($min, $max)功能与date("w")结合使用,我正在努力解决每年需要获得不同结果的部分。

为了说明我的意思,请查看:

$numbers = range(1, 100); //our random array
echo $numbers[date("w")]; //date("w") returns number of week

这里有两个问题:1)它不是真正随机的,2)每年的数字是相同的,3)它没有反映数组的整个大小作为日期(" w&#34 ;)返回1到52之间的数字。

您认为这在纯PHP中是否可以实现?或者我需要为此制作一个cronjob吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您可以在种子中每个月使用相同的数字。只是要清楚函数srand ([ int $seed ] )中的种子。

您可以这样做:

srand(100);
echo rand();

每次返回相同的数字。所以每个月你都可以这样做:

$min = 1;
$max = 100;
date_default_timezone_set('UTC');
$seed = date('Ym'); // it is the date as an integer
srand($seed);
echo rand($min, $max);

注意设置默认时区。如果您不这样做,结果将取决于服务器配置。

- 更新 -

正如@StevenSmith和@axiac所说,你并非100%确定随机生成的数字是唯一的。 换句话说,这意味着范围越宽(min-max)越高,每次有不同数字的概率就越大。

答案 1 :(得分:1)

使用date('Ym')为每个(年,月)组合生成唯一标识符,使用此值初始化伪随机生成器的引擎,然后生成一个随机数:

srand(date('Ym'));
$value = rand(1, 100);

调整第二行以满足您的需求。现在它生成一个介于(和包括)1和100之间的整数。

date('Ym')返回的值在一个月内是相同的。每次使用某个参数调用srand()时,使用该值重新初始化伪随机生成器,然后在调用rand()(多次)时生成相同的伪随机数序列。 / p>

这可确保在整个月内为您生成相同的值。在下个月和随后几年的同一个月中,伪随机数生成器用不同的值初始化,并生成不同的伪随机数序列。

根据您在调用rand()时使用的值,可能会发生本月返回的值在不同月份再次返回。使用大范围的$min$max参数来最小化这种可能性。

答案 2 :(得分:0)

您可以生成随机数,选择最接近的12的倍数,然后添加当前月份数。

例如,如果随机数为616,则最接近的12为612.添加0(因为它当前是1月)给出最终答案612.这将确保该数字在每个月都是唯一的。< / p>