随机数有关的问题

amani11 2011-12-20 04:23:40
干脆的,直接上代码


define('ROUNDS', 1e5);//参考,1000, 10000 ……
$krr = array();

for($i=0;$i<ROUNDS;++$i){
$id = rand(1, 200000000);
if(isset($krr[$id])){
continue;
}
$krr[$id] = TRUE;
}
echo PHP_INT_MAX, DIRECTORY_SEPARATOR, PHP_VERSION, "\n", ROUNDS, '=>', sizeof($krr);


这段代码的结果,没想明白

方便的,麻烦测一下,贴结果,,,
...全文
178 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 amani11 的回复:]

引用 10 楼 linglingtong 的回复:

要是直接 echo rand(1, 200000000);
可以得到大于32768 的数,估计是最多只能随机发生32768次
用mt_rand(1, 200000000)次数会多些



确实是这样子

附新的测试代码如下:
PHP code

define('ROUNDS', 35000);//参考,1000,……
[/Quote]伪随机

http://baike.baidu.com/view/272306.htm
xuzuning 2011-12-20
  • 打赏
  • 举报
回复
2147483647\5.3.6
100000=>32768
amani11 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 linglingtong 的回复:]

要是直接 echo rand(1, 200000000);
可以得到大于32768 的数,估计是最多只能随机发生32768次
用mt_rand(1, 200000000)次数会多些
[/Quote]


确实是这样子

附新的测试代码如下:

define('ROUNDS', 35000);//参考,1000, 10000 ……
$krr = array();

for($i=0;$i<ROUNDS;++$i){
$id = rand(1, 200000000);
if(isset($krr[$id])){
$tmp = 0;
foreach($krr AS $v){
if($v === $id){
echo "$tmp \n";
break;
}
++$tmp;
}
}
$krr[$id] = $id;
}


上面的代码输出,吊诡的地方在于,输出是依照顺序增加的,依此,再写一段测试代码


for($i=0;$i<100;$i++){
echo fun_rand(1, 10000), "\n";/////这里输出每次都一样,hohoho~~~~~~
}

function fun_rand($min, $max){
$res = rand($min, $max);
for($i=0;$i<32767;$i++) rand($min, $max);
return $res;
}




今天没时间了,感谢大家,回头再查一下源码
linglingtong 2011-12-20
  • 打赏
  • 举报
回复
要是直接 echo rand(1, 200000000);
可以得到大于32768 的数,估计是最多只能随机发生32768次
用mt_rand(1, 200000000)次数会多些

xiachao2008 2011-12-20
  • 打赏
  • 举报
回复
XP

[Quote=引用 8 楼 xiachao2008 的回复:]

2147483647\5.3.4 100000=>32768
[/Quote]
xiachao2008 2011-12-20
  • 打赏
  • 举报
回复
2147483647\5.3.4 100000=>32768
ohmygirl 2011-12-20
  • 打赏
  • 举报
回复
刚测试了下,getrandmax()在windows下得到的结果是32767。貌似这里限定rand()的min和max没有起到作用。
改用mt_rand的话,结果可能更大。
amani11 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 linglingtong 的回复:]

结果是: 2147483647\5.3.5 100000=>32768
int rand ([ int $min ], int $max )
rand() 返回 0 到 RAND_MAX 之间的伪随机整数。
在某些平台下(例如 Windows)RAND_MAX 只有 32768。
详情见手册
[/Quote]

echo rand(1, 200000000);

很少有机会能输出少于2^15的数字,,可以随意测一下。。。如果我没理解错误的话

另外,可以
define('ROUNDS', 32769);//结果一样
ohmygirl 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 linglingtong 的回复:]

结果是: 2147483647\5.3.5 100000=>32768
int rand ([ int $min ], int $max )
rand() 返回 0 到 RAND_MAX 之间的伪随机整数。
在某些平台下(例如 Windows)RAND_MAX 只有 32768。
详情见手册
[/Quote]

真相帝。。
手册看的不仔细。
linglingtong 2011-12-20
  • 打赏
  • 举报
回复
结果是: 2147483647\5.3.5 100000=>32768
int rand ([ int $min ], int $max )
rand() 返回 0 到 RAND_MAX 之间的伪随机整数。
在某些平台下(例如 Windows)RAND_MAX 只有 32768。
详情见手册
ohmygirl 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 amani11 的回复:]

引用 1 楼 ohmygirl 的回复:

2147483647\5.2.17 100000=>32768


多测几次呢,,32768 = 2^15, 诡异吗
[/Quote]

感觉跟数组元素个数限制有关....
amani11 2011-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ohmygirl 的回复:]

2147483647\5.2.17 100000=>32768
[/Quote]

多测几次呢,,32768 = 2^15, 诡异吗
ohmygirl 2011-12-20
  • 打赏
  • 举报
回复
2147483647\5.2.17 100000=>32768

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧