我试图创建一个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>";
}
在我的测试中,我没有得到任何结果......我相信循环无限运行......或其他错误。
有人可以帮忙吗?
答案 0 :(得分:1)
如果我正确地收集你的问题,看起来你的方式错了。最简单的方法是生成范围内的随机时间($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>";
}
答案 1 :(得分:0)
您认为这两个将是您的约会
$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);
}
PS。注意我使用了mt_rand函数
答案 2 :(得分:-1)
使用日期值的毫秒表示。伪代码如下:
sm
em
对于i = 0到n,n
是日期数...
3.1随机化sm
和sm + offset
之间的某个值
3.2将生成的值转换为其日期对象表示
3.3分配sm = sm + offset
并检查是否sm < em
offset
是采样间隔{@ 1}}