批处理之家's Archiver

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

[code]perl -le "print rand()"[/code]随机数是这样吧

523066680 发表于 2011-6-5 23:38

[i=s] 本帖最后由 523066680 于 2011-6-5 23:52 编辑 [/i]

…… 这个题目最近就像重温了一遍,用批处理VBS,PERL,C语言各做了一遍。。。。。。
我只在图像渐显上用到
如果是1000 就改 $max为1000吧, 20是为了方便用眼睛验证是否有重复数字[code]
#!/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>;
[/code]我勒个去……刚看清楚, 一千万个,好几分钟

DAIC 发表于 2011-6-6 00:02

[code]$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];
}
[/code][code]timeit perl test.pl >a.txt[/code]Elapsed Time:     0:00:21.801
Process Time:     0:00:21.060

4楼的方法需要21秒多,还有更快的吗?

523066680 发表于 2011-6-6 00:10

[b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=81808&ptid=12670]5#[/url] [i]DAIC[/i] [/b]
这位大妈终于有个回帖了。
那个……  你电脑什么配置,这么快

DAIC 发表于 2011-6-6 00:13

我是2G的内存,2.8G的双核CPU。

523066680 发表于 2011-6-6 00:22

[i=s] 本帖最后由 523066680 于 2011-6-6 00:24 编辑 [/i]

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

:lol   我也想看看有米有更快的算法

523066680 发表于 2017-9-6 11:44

[i=s] 本帖最后由 523066680 于 2017-9-6 11:48 编辑 [/i]

[code]=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;[/code]转眼6年过去了,我也没啥进步,做点修改,电脑CPU比以前好了,
>popup.pl >d:/test.txt
Time used: 7.533s

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

523066680 发表于 2017-9-6 19:41

如果不考虑效率,数量比较少,那就加点糖[code]my @array = (1 .. 20);
my @new_array = map { splice( @array, int(rand($#array+1)), 1 ) } ( 0 .. $#array );[/code]

tigerpower 发表于 2018-4-16 22:56

[code]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;[/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.