找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32436|回复: 11

[问题求助] Perl怎样快速生成大量不重复的随机数?

[复制链接]
发表于 2011-6-4 00:39:07 | 显示全部楼层 |阅读模式
1、生成一千万个互不重复的随机数
2、速度越快越好
发表于 2011-6-5 22:51:23 | 显示全部楼层
呀 这个用vbs , c ,和批处理都做过  ,随机输出不重复,用于图像的渐显效果
是1到1000吗?    忘了perl怎么生成随机数……
发表于 2011-6-5 22:58:36 | 显示全部楼层
  1. perl -le "print rand()"
复制代码
随机数是这样吧

评分

参与人数 1PB +6 收起 理由
523066680 + 6 Thank you ~ 立马搞定

查看全部评分

发表于 2011-6-5 23:38:46 | 显示全部楼层
本帖最后由 523066680 于 2011-6-5 23:52 编辑

…… 这个题目最近就像重温了一遍,用批处理VBS,PERL,C语言各做了一遍。。。。。。
我只在图像渐显上用到
如果是1000 就改 $max为1000吧, 20是为了方便用眼睛验证是否有重复数字

  1. #!/usr/bin/perl
  2. $max=20;
  3. for $i (1..$max) {
  4.         $arr[$i-1]=$i;
  5. }
  6. for ($i=$max;$i>0;$i--) {
  7.         $randx=int( rand() * $i );
  8.         print "$arr[$randx]\n";
  9.         $arr[$randx]=$arr[$i-1];
  10. }
  11. <STDIN>;
复制代码
我勒个去……刚看清楚, 一千万个,好几分钟
 楼主| 发表于 2011-6-6 00:02:24 | 显示全部楼层
  1. $max=10000000;
  2. for $i (1..$max) {
  3.     $arr[$i-1]=$i;
  4. }
  5. for ($i=$max;$i>0;$i--) {
  6.     $randx=int( rand() * $i );
  7.     print "$arr[$randx]\n";
  8.     $arr[$randx]=$arr[$i-1];
  9. }
复制代码
  1. timeit perl test.pl >a.txt
复制代码
Elapsed Time:     0:00:21.801
Process Time:     0:00:21.060

4楼的方法需要21秒多,还有更快的吗?
发表于 2011-6-6 00:10:39 | 显示全部楼层
5# DAIC
这位大妈终于有个回帖了。
那个……  你电脑什么配置,这么快
 楼主| 发表于 2011-6-6 00:13:14 | 显示全部楼层
我是2G的内存,2.8G的双核CPU。
发表于 2011-6-6 00:22:07 | 显示全部楼层
本帖最后由 523066680 于 2011-6-6 00:24 编辑

原来是把结果导出到文本了,真周到,print到屏幕花好多时间……
4楼的方法需要21秒多,还有更快的吗?


   我也想看看有米有更快的算法
发表于 2017-9-6 11:44:14 | 显示全部楼层
本帖最后由 523066680 于 2017-9-6 11:48 编辑
  1. =info
  2.     523066680
  3. =cut

  4. use Time::HiRes qw/time/;

  5. my $time_a = time();
  6. my $max = 10000000;
  7. my @array = ( 1 .. $max );

  8. my $idx = $max;
  9. while ($idx > 0)
  10. {
  11.     $rand = int(rand($idx));
  12.     print $array[$rand],"\n";
  13.     $array[$rand] = $array[$idx-1];
  14.     $idx--;
  15. }

  16. printf STDERR "Time used: %.3fs\n", time() - $time_a;
复制代码
转眼6年过去了,我也没啥进步,做点修改,电脑CPU比以前好了,
>popup.pl >d:/test.txt
Time used: 7.533s

如果不是print重定向到文件,而是写入到新的数组
Time used: 4.154

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 厉害,故贴重游

查看全部评分

发表于 2017-9-6 19:41:28 | 显示全部楼层
如果不考虑效率,数量比较少,那就加点糖
  1. my @array = (1 .. 20);
  2. my @new_array = map { splice( @array, int(rand($#array+1)), 1 ) } ( 0 .. $#array );
复制代码

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 太甜了

查看全部评分

发表于 2018-4-16 22:56:33 | 显示全部楼层
  1. use feature 'say';
  2. use List::Util 'shuffle';
  3. use Time::HiRes 'time';

  4. $time = time();
  5. say for shuffle 1..10000000;
  6. printf STDERR "Time used: %.3fs", time()-$time;
复制代码

评分

参与人数 1PB +6 收起 理由
523066680 + 6 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:52 , Processed in 0.021140 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表