这个问题在这里已有答案:
我想在rand()
func中定义差距。在Php中差距就像在数学中一样。例如;
$integer1= rand(1,100);
但我希望消除25,60之间的差距。它就像rand((1,25),(60,100));
当然这种符号是不被php接受的。
任何建议,除阵列? -谢谢
$integer1 = rand (1, 66); // [1 .. 66]
if ($integer1 > 25) $integer1 += 34; // [1 .. 25, 60 .. 100]
如果你只有一个上限,那么@ Mikhail的回答似乎是最好的选择。如果你可以有多个差距,那么一个变量可能是:
$a = range(1,25);
$b = range(60, 100);
// add another ranges if needed
$arr = array_merge($a, $b); // merge all ranges
echo $arr[array_rand($arr)];
那么你可以自己动手,但要注意以下几点。应以相同的概率绘制每个数字。您将需要确定实际绘制的数字范围,其概率与范围的大小成比例,例如:从[1,10],[21,40]得出的数据应该从[21,40]中抽取大约两倍于[1,10]的数字。
这是一般的想法:
确定所有范围的长度。
绘制从0到所有范围长度的随机数
检查数字在哪个范围内。
从它所在的范围内绘制相应的数字。
function randFromRanges(...$ranges) {
$totalRangeSize = array_sum(array_map(function ($range) {
return $range[1] - $range[0];
}, $ranges));
$numberToDraw = rand(0, $totalRangeSize);
foreach ($ranges as $range) {
if ($numberToDraw <= ($range[1] - $range[0])) {
return $range[0]+$numberToDraw;
} else {
$numberToDraw -= ($range[1] - $range[0]);
}
}
}
这是一个沙盒,显示所有值似乎都是等概率的:
http://sandbox.onlinephpfunctions.com/code/b02603e4a9986132073d203c98f8255c2dd62e47