Я предпочитаю использовать регулярные выражения:
Regex.Replace("1112224444", @"(\d{3})(\d{3})(\d{4})", "$1-$2-$3");
Ваше решение в порядке, но если вы хотите более строгое моделирование поставленной проблемы (и несколько более качественный Python ;-), попробуйте:
import random
iterations = 100000
doors = ["goat"] * 2 + ["car"]
change_wins = 0
change_loses = 0
for i in xrange(iterations):
random.shuffle(doors)
# you pick door n:
n = random.randrange(3)
# monty picks door k, k!=n and doors[k]!="car"
sequence = range(3)
random.shuffle(sequence)
for k in sequence:
if k == n or doors[k] == "car":
continue
# now if you change, you lose iff doors[n]=="car"
if doors[n] == "car":
change_loses += 1
else:
change_wins += 1
print "Changing has %s wins and %s losses" % (change_wins, change_loses)
perc = (100.0 * change_wins) / (change_wins + change_loses)
print "IOW, by changing you win %.1f%% of the time" % perc
типичный результат:
Changing has 66721 wins and 33279 losses
IOW, by changing you win 66.7% of the time
Монти никогда не открывает дверь с машиной - в этом весь смысл шоу (он не ваш друг и знает, что находится за каждой дверью)
Вы упомянули, что все варианты выбора жестко запрограммированы. Но если вы присмотритесь, вы заметите, что то, что вы считаете «выбором», на самом деле вовсе не является выбором. Решение Монти не теряет общности, поскольку он всегда выбирает дверь, за которой стоит коза. Ваш обмен всегда определяется тем, что выбирает Монти, и поскольку «выбор» Монти на самом деле не был выбором, то и ваш выбор тоже. Ваше моделирование дает правильные результаты ..
Мне нравится что-то в этом роде.
#!/usr/bin/python
import random
CAR = 1
GOAT = 0
def one_trial( doors, switch=False ):
"""One trial of the Monty Hall contest."""
random.shuffle( doors )
first_choice = doors.pop( )
if switch==False:
return first_choice
elif doors.__contains__(CAR):
return CAR
else:
return GOAT
def n_trials( switch=False, n=10 ):
"""Play the game N times and return some stats."""
wins = 0
for n in xrange(n):
doors = [CAR, GOAT, GOAT]
wins += one_trial( doors, switch=switch )
print "won:", wins, "lost:", (n-wins), "avg:", (float(wins)/float(n))
if __name__=="__main__":
import sys
n_trials( switch=eval(sys.argv[1]), n=int(sys.argv[2]) )
$ ./montyhall.py True 10000
won: 6744 lost: 3255 avg: 0.674467446745