【发布时间】:2018-08-21 15:04:58
【问题描述】:
一个简单的问题一直困扰着我,我不知道如何用数学来证明它,所以我编写了一个简单的 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);
【问题讨论】:
-
我投票决定将此问题作为离题结束,因为它与特定的编程问题无关。在 Code Review 上会更合适。
-
@Borodin 我猜问题是,如果您一次取出所有 20 只袜子 2 对,您多久会得到 all 对?但这肯定不是很清楚,这不是代码的作用
-
我不明白为什么这会困扰你。拿了一只袜子后,剩下的十只袜子匹配,九只不匹配。比率是 10:9 或 1.11...但是您的代码需要一些工作,您应该将其提交给Code Review 以便编写更好的代码。特别是,在程序顶部的块中声明 every 变量是有害的,并且表明了一种非常老式的风格。它几乎抵消了
use strict的优势,它只能被私下注释掉,而不必担心被打断! -
@ysth:啊,我明白了。谢谢,我已经变得像绵羊一样,并假设了以前所有袜子/球/大理石盲抽问题的另一种变体。正如您所说,问题没有正确定义。我想“如果他们随机配对” 需要详细说明。但不在这里!
-
@Pete:“我不像你们那样是程序员” 编写软件让你成为程序员,你在 Stack Overflow 上的问题是接受与其他任何人相同的审查。你不能躲在“不是真正的程序员”的盾牌后面,希望逃避批评。你显然学到了很多东西,我建议你继续学习,这样你可以更好地尊重自己的工作。您应该将 Stack Overflow 视为 Wikipedia:它是问答事实的存储库,您至少应该胜任您的工作。
标签: perl math probability