我的模拟结果是不直观的

时间:2018-08-21 15:04:59

标签: perl math probability

一个简单的问题困扰着我,我不知道该怎么做才能证明这一点,所以我写了一个简单的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);

2 个答案:

答案 0 :(得分:1)

假设您从抽屉中取出R袜子。

现在只剩10 L的袜子(可以正确配对)

还有9只R袜子(配对不正确)

所以10正确:9错误大约是1.11:1。

您没有说期望的数字,但是如果脚本中显示的是1.12:1,则接近正确的结果。

答案 1 :(得分:1)

我猜的问题是,如果一次抽出全部20条袜子2,您将多久获得一次正确的袜子?但这当然还不清楚,这也不是代码的作用。您似乎要对内循环中发现的好对和不良对进行总计,这意味着要对内循环之后的好结果与不良结果进行总计。

每次删除袜子都无济于事。

尝试在尽可能小的范围内声明变量。

FWIW这是我要做的:

select()

这表明在不到0.14%的时间内获得10个匹配对。