Dmi*_*try 0 random scripting perl
我想做一个实验,我创建一个列表,其中包含许多随机生成的序列列表,这些列表都包含每个数字0到9(包括0到9),也就是说,生成函数是生成随机数并将它们放在整数列表中列表中找不到至少1位数字.
实验的目的是尝试对这样一个函数中的预期数字数字,序列可以获得多长时间(我的程序可以无限循环,从不找到最后一个数字?)以及其他有趣的东西进行一些概括. (为了我).
我正在使用PERL进行实验.
这个想法起初看起来很简单,我坐下来,创建了一个列表,并且发现我可以创建一个运行任意次数的循环(我决定选择100次),它调用一个函数generate_sequence(input:none,output :包含每个数字中至少1个的数字列表)并将其添加到列表中.
我很快意识到,我正在努力干净地指定实际意义,生成包含每个数字之一的数字列表.
我最初的尝试是创建一个数字列表(0..9),当我生成数字时,如果它在列表中,我将搜索该数字的列表,并将其删除.这样,它将生成数字,直到"仍然需要"的数字列表为空.这种方法似乎没有吸引力,可能涉及许多冗余任务,例如检查生成的数字是否在每次生成数字时所需的数字列表中...
对这样的问题有更优雅的解决方案吗?我对接近这个功能的方式非常不满意.
一般来说,我需要一个不接受任何内容的函数F,并返回一个随机生成的数字列表,其中包含每个数字1..9,也就是说,只要生成从1到9的每个数字,它就会停止.
提前谢谢.
好吧,问题是如果你"随机滚动"你实际上并不知道你需要多少次迭代 - 理论上它可能是无限的.
如果你正在这样做,perl你可能会更好地使用该List::Util模块,并为shuffle它提供一个你想要随机播放的元素列表.
例如
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw( shuffle );
my @shuffled = shuffle ( 0..9 );
print @shuffled;
Run Code Online (Sandbox Code Playgroud)
你可以很容易地重现这一点,但是为什么在List::Util5.7.3 时核心是什么时候
但是,它确实听起来像是在尝试生成可能包含重复的列表,直到您达到终止条件.
我不完全确定为什么,但最好使用散列,并计算出现次数.(并在'钥匙'完成时终止).
例如:
#!/usr/bin/env perl
use strict;
use warnings;
my %seen;
my @list_of_numbers;
while ( keys %seen < 10 ) {
my $gen = int rand ( 10 );
$seen{$gen}++;
push ( @list_of_numbers, $gen );
}
print @list_of_numbers;
Run Code Online (Sandbox Code Playgroud)
注意 - 由于"随机"的性质,实际上这种滚动极长序列的可能性非常小 - 这意味着理论上你可能有一个很长的'连胜'而不是滚动6.
对于奖励积分,%seen您的生成数字的频率范围.