首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取1-200之间的随机数,但忽略从查询中读取的数字

问获取1-200之间的随机数,但忽略从查询中读取的数字
EN

Stack Overflow用户
提问于 2012-02-04 21:39:52
回答 4查看 371关注 0票数 1

我需要获取一个介于1-200之间的随机数,但同时我需要防止选择一个已经用于特定REMOTE_ADDR的随机数(存储在表中)。

这就是我到目前为止所拥有的(我尝试了几种不同的方法):

代码语言:javascript
复制
$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编写。

EN

回答 4

Stack Overflow用户

发布于 2012-02-04 21:46:12

这个答案假设你有200个项目,并收集你不想显示的项目。或者,您可以仅查询可用项的id,并从中选择,您需要为其创建一个包含可用项的表。

创建将连续数字映射到(非连续)可用数字的映射。假设数字1和3正在使用中,您可以映射到2和4(依此类推)。

实际上,可以使用一个简单的数组(非关联)来实现这一点。你可以这样做:

代码语言:javascript
复制
$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的显示图像列表,然后再次选择;有关此问题,请参阅其他答案。

票数 1
EN

Stack Overflow用户

发布于 2012-02-04 22:05:14

运行select,只选择id列,而不是使用*。然后使用:

代码语言:javascript
复制
while($row7[] = mysql_fetch_array($query7));
do{
  $rand = rand(0,200);
}while(in_array($rand,$row7));
票数 1
EN

Stack Overflow用户

发布于 2012-02-04 22:11:19

类似这样的东西

代码语言:javascript
复制
// 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];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9141278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档