标题: [问题求助] Perl怎样快速生成大量不重复的随机数? [打印本页]
作者: DAIC 时间: 2011-6-4 00:39 标题: Perl怎样快速生成大量不重复的随机数?
1、生成一千万个互不重复的随机数
2、速度越快越好
作者: 523066680 时间: 2011-6-5 22:51
呀 这个用vbs , c ,和批处理都做过 ,随机输出不重复,用于图像的渐显效果
是1到1000吗? 忘了perl怎么生成随机数……
作者: CUer 时间: 2011-6-5 22:58
复制代码
随机数是这样吧
作者: 523066680 时间: 2011-6-5 23:38
本帖最后由 523066680 于 2011-6-5 23:52 编辑
…… 这个题目最近就像重温了一遍,用批处理VBS,PERL,C语言各做了一遍。。。。。。
我只在图像渐显上用到
如果是1000 就改 $max为1000吧, 20是为了方便用眼睛验证是否有重复数字- #!/usr/bin/perl
- $max=20;
- for $i (1..$max) {
- $arr[$i-1]=$i;
- }
- for ($i=$max;$i>0;$i--) {
- $randx=int( rand() * $i );
- print "$arr[$randx]\n";
- $arr[$randx]=$arr[$i-1];
- }
- <STDIN>;
复制代码
我勒个去……刚看清楚, 一千万个,好几分钟
作者: DAIC 时间: 2011-6-6 00:02
- $max=10000000;
- for $i (1..$max) {
- $arr[$i-1]=$i;
- }
- for ($i=$max;$i>0;$i--) {
- $randx=int( rand() * $i );
- print "$arr[$randx]\n";
- $arr[$randx]=$arr[$i-1];
- }
复制代码
- timeit perl test.pl >a.txt
复制代码
Elapsed Time: 0:00:21.801
Process Time: 0:00:21.060
4楼的方法需要21秒多,还有更快的吗?
作者: 523066680 时间: 2011-6-6 00:10
5# DAIC
这位大妈终于有个回帖了。
那个…… 你电脑什么配置,这么快
作者: DAIC 时间: 2011-6-6 00:13
我是2G的内存,2.8G的双核CPU。
作者: 523066680 时间: 2011-6-6 00:22
本帖最后由 523066680 于 2011-6-6 00:24 编辑
原来是把结果导出到文本了,真周到,print到屏幕花好多时间……
我也想看看有米有更快的算法
作者: 523066680 时间: 2017-9-6 11:44
本帖最后由 523066680 于 2017-9-6 11:48 编辑
- =info
- 523066680
- =cut
-
- use Time::HiRes qw/time/;
-
- my $time_a = time();
- my $max = 10000000;
- my @array = ( 1 .. $max );
-
- my $idx = $max;
- while ($idx > 0)
- {
- $rand = int(rand($idx));
- print $array[$rand],"\n";
- $array[$rand] = $array[$idx-1];
- $idx--;
- }
-
- 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
作者: 523066680 时间: 2017-9-6 19:41
如果不考虑效率,数量比较少,那就加点糖- my @array = (1 .. 20);
- my @new_array = map { splice( @array, int(rand($#array+1)), 1 ) } ( 0 .. $#array );
复制代码
作者: tigerpower 时间: 2018-4-16 22:56
- use feature 'say';
- use List::Util 'shuffle';
- use Time::HiRes 'time';
-
- $time = time();
- say for shuffle 1..10000000;
- printf STDERR "Time used: %.3fs", time()-$time;
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |