随机产生独一无二的数字

bing15 2012-10-09 10:48:06
随机产生独一无二6位的数字和对应的12位数字.比如:需要1万个
如:
244855 587753043808
558676 168139952943
...全文
474 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
如果是5万的数据呢?我加到5万的话,也就是$i<150000,那么就会执行exit('有重复, 重新执行');
就不能生成了.
[/Quote]
php 的伪随机数发生器的周期为 32768,就是说 32768 次 rand 后就要出现重复了
我的代码只是利用了这一点,代码中使用了数组是为了让你有机会检查
其实只需要直接在第一个循环中输出就可以了,程序变形为
$s = 100000;
$e = 999999;
for($i=0; $i<10000; $i++) {
echo rand($s, $e) . ' ' . rand($s, $e) . rand($s, $e) .'<br>';
}


当然,在超出为随机数周期时,是需要缓存中间结果并检查是否有重复的
你只需要1万个测试数据,就没有必要干那吃力不讨好的事情了
_暮落_ 2012-10-10
  • 打赏
  • 举报
回复
rand
www_7di_net 2012-10-09
  • 打赏
  • 举报
回复
For($i=10000;$i<=99999;$i++) {
Echo "244855 5877530{$i}<br>";
}
acabin 2012-10-09
  • 打赏
  • 举报
回复
用内置随机数发生器就可以了撒…………
bing15 2012-10-09
  • 打赏
  • 举报
回复
我用了几个办法,不过都没有比对数据,都会产生重复的,大概就是几个.
yunprince 2012-10-09
  • 打赏
  • 举报
回复
把随机出来的数据记录下来,下次随机的时候比对,暂时只想到这么一个方法,不过很麻烦,晓得有其他方法不....
Meteorlet 2012-10-09
  • 打赏
  • 举报
回复
<?php
$numbers = range(100000,999999);
srand((float)microtime()*1000000);
shuffle($numbers);

$i = 10000;
foreach ($numbers as $number) {
if ($i-- < 0) break;
echo "$number\r\n";
}
?>
www_7di_net 2012-10-09
  • 打赏
  • 举报
回复
生成1万的随机数,如果服务器不够牛的话稍微复杂一点进行判断重复,然后取值存入内存.这对于服务器来说是一笔很大的开支.
请问bing15,你是要做什么工作需要一次性产生这么多的随机数?
难道不能即时产生吗?类似 Echo time().rand(10000,99999);
bing15 2012-10-09
  • 打赏
  • 举报
回复
11楼的和老大的是一样的.
bing15 2012-10-09
  • 打赏
  • 举报
回复
11楼的和老大的是一样的.
bing15 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
你可以这样生成

PHP code
for($i=0; $i<30000; $i++) { //产生3万个6位数
$r[] = rand(100000, 999999);
}
if(count(array_flip(array_count_values($r)))>1) {//检查是否有重复
exit('有重复, 重新执行');
}

foreach(array_chu……
[/Quote]
如果是5万的数据呢?我加到5万的话,也就是$i<150000,那么就会执行exit('有重复, 重新执行');
就不能生成了.
StAlan 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

PHP code

$check = array();
for($i=0; $i<30000; $i++)
{
do
{
$rnum = rand(100000, 999999);
}
while (isset($check[$rnum]));
$check[$rnum] = 1;
}
print_r(array_keys($check));


这是生成1万个不……
[/Quote]
复制了楼上的循环代码,忘改循环边界了,应该是

$check = array();
for($i=0; $i<10000; $i++)
{
do
{
$rnum = rand(100000, 999999);
}
while (isset($check[$rnum]));
$check[$rnum] = 1;
}
print_r(array_keys($check));
StAlan 2012-10-09
  • 打赏
  • 举报
回复

$check = array();
for($i=0; $i<30000; $i++)
{
do
{
$rnum = rand(100000, 999999);
}
while (isset($check[$rnum]));
$check[$rnum] = 1;
}
print_r(array_keys($check));

这是生成1万个不重复6位数的,12位的同理,然后两两配对使用就好了。就是用一个hash利用key记录已经生成过的数,然后用isset判断。
xuzuning 2012-10-09
  • 打赏
  • 举报
回复
你可以这样生成
for($i=0; $i<30000; $i++) { //产生3万个6位数
$r[] = rand(100000, 999999);
}
if(count(array_flip(array_count_values($r)))>1) {//检查是否有重复
exit('有重复, 重新执行');
}

foreach(array_chunk($r, 3) as $t) { //切割成3个一组
$res[] = array( $t[0], $t[1].$t[2]); //放到数组, 你根据你的需要进行保存
}
print_r($res);
bing15 2012-10-09
  • 打赏
  • 举报
回复
没有联系,只要是1万的6位数不能重复,1万个12位的数了也不能重复.
只不过他们是成对的出现,左边是6位,右边是12位.
xuzuning 2012-10-09
  • 打赏
  • 举报
回复
前后两个数有联系吗?
bing15 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
For($i=10000;$i<=99999;$i++) {
Echo "244855 5877530{$i}<br>";
}
[/Quote]
但是这样一来前面的6位没有随机,必须是成对的出现.
ws_123456 2012-10-09
  • 打赏
  • 举报
回复
把随机数存在数据库!~~当做主键ID就可以了!~
zhouzhipen 2012-10-09
  • 打赏
  • 举报
回复
GUID
http://baike.baidu.com/view/185358.htm
PHP有函数可直接生成GUID

21,886

社区成员

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

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