楼上楼上的,怎么作验证?可以一次性取出所有热门新闻的id,然后存入数组。如下例:
<?
$n=5;
if(!session_is_registered("arr")||count($arr)<($n+2)){
$arr=array(12,34,65,324,56,2,5,7,32,62,84,33,74,23,66,42,45,31,43,111,112,113,114,115);//假设这里为取出的id数组
session_register("arr");
}$m=1;
while($m<$n+1){
$k=rand(0,count($arr));
if($arr[$k]){
$rel[]=$arr[$k];
$arr[$k]=null;
$m++;
}
}
$arr=array_unique($arr);
$arr=array_values($arr);
print_r($rel);
//最后得出的$rel数组就是你当前应该取出的新闻id数组。这样可以避免复杂查询
?>
<?
$n=5;
if(!session_is_registered("arr")||count($arr)<($n+2)){
$arr=array(12,34,65,324,56,2,5,7,32,62,84,33,74,23,66,42,45,31,43,111,112,113,114,115);//假设这里为取出的id数组
session_register("arr");
}$m=1;
while($m<$n+1){
$k=rand(0,count($arr));
if($arr[$k]){
$rel[]=$arr[$k];
$arr[$k]=null;
$m++;
}
}
$arr=array_unique($arr);
$arr=array_values($arr);
print_r($rel);
//最后得出的$rel数组就是你当前应该取出的新闻id数组。这样可以避免复杂查询
?>
假设有1w条热点新闻的记录,每次随机选取5条,现在为了加快选取速度就每次确定一个随机起点,在这个起点选取连续的5条记录.session_start();
$sid=session_id(); //取出session_id;
srand($sid); //生成随机数种子
if(!$start)
$start=1; // $start为session变量,储存起点号,每次打开新闻页就把$start+1.for($i=1;$i<=$start-1;$i++)
rand(1,2000);
//因为假设有1w条记录,每次选取连续5条记录,所以只产生1到2000的开始点就可以.
//这个循环的作用是产生$start-1个随机序列(这是之前打开新闻页的时候产生的随机序列)$startRec=rand(1,2000); //取出这次的开始点.$sql="select * from table where hotnews=1 order by id desc limit $startRec,5";
$result=mysql_query($sql);
...... //处理,输出这五条热点新闻.$start++;
session_register("start");//把开始点次数加1,以便下次产生不同的开始点.
反正这些不是关键嘛.不过这样做效率肯定低了很多咯.:>>比如(没具体试过啦,看思路就是):
session_start();
$sid=session_id();
srand($sid); if(!$start)
$start=1; for($i=1;$i<=5*($start-1);$i++)
rand(1,10000); for($i=1;$i<=5;$i++){ //循环5次,一次产生5个随机数.然后取出这5条记录
$startRec=rand(1,10000);
$sql="select * from table where hotnews=1 order by id desc limit $startRec,1";
$result=mysql_query($sql);
...... //处理,输出1条热点新闻.
}
$start++;
session_register("start");
SELECT * FROM YourTable ORDER BY RAND() LIMIT 0,5also see
http://www.bitbybit.dk/mysqlfaq/addnote.html?ch=ch7_21_0
0.1,.53,.23,.65,.10,.89,.12,.55.... (当然mysql的rand()产生数列的位数多很多位)
第二次
0.32,0.11,0.24,0.76,0.1,0.99,0.78.....那么0.1这个随机数是相同的。
而用我的那个方法,每个用户拥有一个稳定的随机数列:
比如:
6,334,233,76,346,23,87,1002,3233,6323,656.......
我按顺序取这个数列的值,在取值数量<<随机数范围的情况下,数字几乎不会重复。不信大家可以试试用程序验证一下。数字重复的几率我这个方法肯定少很多.