我需要获取一个介于1-200之间的随机数,但同时我需要防止选择一个已经用于特定REMOTE_ADDR的随机数(存储在表中)。
这就是我到目前为止所拥有的(我尝试了几种不同的方法):
$ip = $_SERVER['REMOTE_ADDR'];
$query7 = "
SELECT *
FROM IP
WHERE IP = '$ip'
";
$result7 = mysql_query($query7) or die(mysql_error());
$rows7 = mysql_num_rows($result7);
while ($row7 = mysql_fetch_array($result7)){
$id = $row7['ID'];
}我使用随机数来选择要显示的图像,但我的用户抱怨为他们选择的图像不够随机;也就是说,相同的图像被“随机”选择得太频繁,有时会反复显示相同的图像。
如果有其他选择,它不一定要用PHP编写。
发布于 2012-02-04 21:46:12
这个答案假设你有200个项目,并收集你不想显示的项目。或者,您可以仅查询可用项的id,并从中选择,您需要为其创建一个包含可用项的表。
创建将连续数字映射到(非连续)可用数字的映射。假设数字1和3正在使用中,您可以映射到2和4(依此类推)。
实际上,可以使用一个简单的数组(非关联)来实现这一点。你可以这样做:
$reserved = array(1, 3); // fill $reserved using your code
$available = array();
for ($i = 1; $i <= 200; $i++) {
if (!in_array($i, $reserved)) {
$available[] = $i;
}
}
if (count($available) > 0) {
$random_index = rand(0, count($available) - 1);
$r = $available[$random_index];
} else {
// Nothing available!
}当您用完尚未显示的图片时,将没有什么可选择的。在这种情况下,count($available)将为零。解决此问题的一种方法是清除当前IP的显示图像列表,然后再次选择;有关此问题,请参阅其他答案。
发布于 2012-02-04 22:05:14
运行select,只选择id列,而不是使用*。然后使用:
while($row7[] = mysql_fetch_array($query7));
do{
$rand = rand(0,200);
}while(in_array($rand,$row7));发布于 2012-02-04 22:11:19
类似这样的东西
// all ids from 1 to 100
$all = array_fill(1, 200, 0);
// remove used
foreach ($used as $i) {
unset($all[$i]);
}
// get survived keys
$keys = array_keys($all);
// get random position, note that the array with keys is 0 based
$j = rand(0, count($all) - 1);
return $keys[$j];https://stackoverflow.com/questions/9141278
复制相似问题