一个简单的问题困扰着我,我不知道该怎么做才能证明这一点,所以我写了一个简单的Perl程序来近似答案,我只是不同意它的结果。
我是错了还是我的脚本缺少内容?
10对相同的袜子,不同的是左右袜子。如果他们随机配对,正确配对与错误配对的概率是多少?
我的意思是,如果我被蒙住眼睛了,把抽屉里的所有20只袜子配对,正确对与错误对的比率是多少?
我的脚本显示大约1.12比1可以纠正错误的比率。
对吗?
#!/usr/bin/perl
#SockCruncher
#use strict;
use warnings;
use List::Util 'shuffle';
my @tumble_dryer = (R,R,R,R,R,R,R,R,R,R,L,L,L,L,L,L,L,L,L,L);
my @rand_socks = shuffle(@tumble_dryer);
my $sock_pop1;
my $sock_pop2;
my $pair_counter = 1;
my @rev_rand_socks;
my $good_pair = 0;
my $bad_pair = 0;
my $counter = 0;
open (OUT,'>pairing.txt') or die ("Can't open pairing.txt for writing\n");
print OUT "Sock Sorter\n-----------\n\n";
print OUT "10 pairs of socks all identical appart from them being either left or right. 10 left & 10 right.\n";
print OUT "The 20 socks are shuffled in an array and the first 2 popped out.\n";
print OUT "The remaining socks are shuffled again and the first 2 popped out..... and so on.\n\n";
while ($counter < 100000) {
while ($pair_counter <= 10) {
print OUT "Socks : ";
print OUT join(",", @rand_socks);
@rev_rand_socks = reverse @rand_socks; #Just done so the output file looks better. The LHS 2 elements are popped and eventually spliced off.
$sock_pop1 = pop @rev_rand_socks;
$sock_pop2 = pop @rev_rand_socks;
print OUT " (P$pair_counter : $sock_pop1.$sock_pop2) ";
if (($sock_pop1 eq "L") && ($sock_pop2 eq "R")) {$good_pair = $good_pair +1;}
if (($sock_pop1 eq "R") && ($sock_pop2 eq "L")) {$good_pair = $good_pair +1;}
if (($sock_pop1 eq "L") && ($sock_pop2 eq "L")) {$bad_pair = $bad_pair +1;}
if (($sock_pop1 eq "R") && ($sock_pop2 eq "R")) {$bad_pair = $bad_pair +1;}
splice @rand_socks, 0, 2;
@rand_socks = shuffle(@rand_socks);
$pair_counter = $pair_counter + 1;
}
print OUT " Good pairs : $good_pair Bad pairs : $bad_pair\n";
$counter = $counter + 1;
$pair_counter = 1;
@tumble_dryer = (R,R,R,R,R,R,R,R,R,R,L,L,L,L,L,L,L,L,L,L);
@rand_socks = shuffle(@tumble_dryer);
}
my $ratio = $good_pair/$bad_pair;
print "\nGood pairs = $good_pair Bad pairs = $bad_pair Good pair to bad pair ratio : $ratio.\n";
close (OUT);
答案 0 :(得分:1)
假设您从抽屉中取出R袜子。
现在只剩10 L的袜子(可以正确配对)
还有9只R袜子(配对不正确)
所以10正确:9错误大约是1.11:1。
您没有说期望的数字,但是如果脚本中显示的是1.12:1,则接近正确的结果。
答案 1 :(得分:1)
我猜的问题是,如果一次抽出全部20条袜子2,您将多久获得一次正确的袜子?但这当然还不清楚,这也不是代码的作用。您似乎要对内循环中发现的好对和不良对进行总计,这意味着要对内循环之后的好结果与不良结果进行总计。
每次删除袜子都无济于事。
尝试在尽可能小的范围内声明变量。
FWIW这是我要做的:
select()
这表明在不到0.14%的时间内获得10个匹配对。