我正在尝试创建一个 for 循环,在其中指定开始日期和结束日期,并且我想随机混合日期,其中每个日期将始终晚于其前一个日期并且早于下一个数字。
我需要没有预定义的日期集,我可能有 10 个 - 我可能有 100 或 1000 个,只要它们存在于开始和结束日期内。
例:
2015-01-15 08:06:00
2015-01-15 15:23:42
2015-01-16 06:03:00
.........
.........
2015-01-20 08:18:32
这就是我所拥有的(这是错误的):
$start = strtotime('2015-01-10 08:00:00');
$end = strtotime('2015-01-20 10:57:59');
for ($i=$start;$i<$end;$i++) {
//Current time + Anywhere between 1 hour and 3 days
$x = $i + (int)rand(3600,259200);
echo "<p>" . date('Y-m-d H:i:s', $x) . "</p>";
}
在我的测试中,我没有得到任何结果...我相信循环正在无限运行...或者别的什么问题。
谁能帮忙?
如果我正确收集您的问题,那么您似乎走错了路。最简单的方法是在一定范围内($start
到 $end
之间)生成随机时间,然后对它们进行排序。这样,您在选择随机间隔时就不必猜测还剩下多少时间空间。
$start = strtotime('2015-01-10 08:00:00');
$end = strtotime('2015-01-20 10:57:59');
$num_randoms = 10;
for ($i=0;$i<$num_randoms;$i++) {
$dates []= (int)rand($start,$end);
}
sort($dates);
foreach ($dates as $x) {
echo "<p>" . date('Y-m-d H:i:s', $x) . "</p>";
}
你以为这两个将是你的约会对象
$start = strtotime('2015-01-10 08:00:00');
$end = strtotime('2015-01-20 10:57:59');
您还假设您将使用特定的秒范围来生成伪随机数
$min = 3600; // 1 hour
$max = 259200; // 72 hours (3 days)
您需要做的第一步是使用最大范围减少结束秒数。这将向您保证后一个日期将在指定日期之前
$end -= $max;
最后,这是正确的循环。我使用了循环while
因为它更具可读性。
while ($start < $end) {
$start += (int) mt_rand($min, $max); // add the generated value to the start seconds
echo date('Y-m-d H:i:s', $start);
}
请注意,我使用了mt_rand函数
使用日期值的毫秒表示形式。伪代码如下:
- 将开始日期转换为其毫秒表示形式
sm
- 将结束日期转换为其毫秒表示形式
em
-
对于 i = 0 到 n 时,
n
是日期数...
3.1 随机化sm
和sm + offset
之间的一些值3.2 将生成的值转换为其日期对象表示形式3.3 分配
sm = sm + offset
并检查是否sm < em
offset
是采样间隔的大小,offset <= (em - sm) / n