生成随机数,直到生成每个数字[0,9]

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的每个数字,它就会停止.

提前谢谢.

Sob*_*que 5

好吧,问题是如果你"随机滚动"你实际上并不知道你需要多少次迭代 - 理论上它可能是无限的.

如果你正在这样做,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您的生成数字的频率范围.