我需要在给定范围内生成一个随机数。数字对于一年中的每个新月份必须是不同的,并且它应该与前一年在该给定月份生成的数字不同(尽管理论上可行)。
我在考虑将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吗?
感谢您的帮助。
答案 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>