niedziela, maja 09, 2010

Matematyczne podstawy zakupu skarpetek ;-)

Sprawdzimy dziś lifehacka znanego pewnie wielu osobom ;-)
Lifehack mówi "kupując skarpetki kup kilka identycznych par, zamiast kilku różnych par, wtedy starczą na dłużej".
Uzasadnienie jest takie, że jeżeli masz 10 par identycznych skarpetek, to gdy potarga Ci się jedna z nich, to masz 9 par, ale gdy potarga się kolejna z pozostałych 19 skarpetek to tych par masz nadal 9, ogólnie liczba par to liczb skarpetek podzielona przez 2 i zaokrąglona w dół. Czyli masz średnio konieczne 2 awarie by wyeliminować daną parę skarpetek.
Gdy kupisz 10 różnych par, to wystarczy pojedyncza awaria skarpetki i zima, cała para jest do wyrzucenia.
OK, ma to sens, ale trzeba to sprawdzić ;-)
W tym celu napisałem sobie 2 proste programiki w JavaScript [takie, które wykona Windows Script Host].
W obu przyjąłem, że szansa na awarię skarpetki wynosi 5% na włożenie [czyli średnio skarpetka potarga się raz na 20 noszeń], przyjąłem też dla uproszczenia, że nigdy 2 skarpetki się wspólnie nie potargają. Dodatkowo skarpetki nie mają pamięci więc każda w dowolnym noszeniu zachowuje się tak samo i skarpetka noszona pierwszy raz ma dokładnie takie samo prawdopodobieństwo przeżycia jak skarpetka noszona już 100 razy [to założenie stąd, że dzięki temu kod jest o wiele prostszy ;-) a i odpowiada to rzeczywistości bo głównym psujem skarpetek są paznokcie, które zwykle od razu załatwiają skarpetkę ;-)].
No i okazuje się, że po uruchomieniu obu programów przy założeniu, że mamy 10 par skarpetek (a każdy program "zdzierał" te skarpetki 100 tysięcy razy), w sytuacji gdy każda para jest inna skarpetki wystarczą nam na około 200 noszeń, w przypadku gdy wszystkie 10 par jest identycznych mamy tych noszeń około 380 :-)
Przy 5 parach mamy odpowiednio średnio 100 noszeń dla różnych par i 180 dla identycznych.
Czyli dla n różnych par skarpetek przy prawdopodobieństwie potargania równym P mamy :
N = n/P [noszeń]
Dla n identycznych par, przy prawdopodobieństwie potargania równym P mamy zaś noszeń tyle:
N = (n*2-1)/P [noszeń]
Widzimy więc, że kupowanie identycznych par skarpetek pozwala nam na noszenie ich przez czas o prawie 2 razy dłuższy ;-)
A tutaj programy, które pozwolą zweryfikować tego lifehacka ;-)
allDifferent.js [czyli każda para z innej parafii ;-)]:
var DEFECT_PROB = 0.05;
var REPETITIONS = 100000;
var HOW_MANY_PAIRS = 5;

function wasDefectDuringWearing() {
var f = Math.random();
if (f>DEFECT_PROB) return true;
return false;
}

var sum=0;
for (var j=0; j<REPETITIONS ; j++) {
var count = 0;
for (var i=0; i<HOW_MANY_PAIRS; i++) {
 do {
  count++;
 } while (wasDefectDuringWearing());
}
sum+=count;
}
WScript.Echo("--------");
WScript.Echo(sum/REPETITIONS );
allTheSame.js [czyli wszystkie skarpetki takie same ;-)]:
var DEFECT_PROB = 0.05;
var REPETITIONS = 100000;
var HOW_MANY_PAIRS = 10;

function wasDefectDuringWearing() {
var f = Math.random();
if (f>DEFECT_PROB) return true;
return false;
}

var sum = 0;
for (var j=0; j<REPETITIONS ; j++) {
var count = 0;
var socksCount = 2*HOW_MANY_PAIRS;
do {
 do {
  count++;
 } while (wasDefectDuringWearing());
 socksCount--;
} while (socksCount>=2)
sum+=count;
}

WScript.Echo("------------");
WScript.Echo(sum/REPETITIONS);
Na koniec ciekawostka, oczywiście gdy pisałem te programiki wyżej to ich nazwy były dokładnie odwrotne do ich działania, bo mi się pomyliło który edytor co zawiera ;-)
A wszystko wyżej powstało jako wynik frustracji po tym, że przez poprzedni tydzień napisałem sobie 2 w miarę fajne rzeczy [Buzz Troll Remover'a i cieniowanie Gourauda w JavaScript] przez co się nakręciłem i fajnie było, po czym przez kolejne dni nic mi do głowy fajnego nie przychodziło i oglądałem głównie TV co jest złe bo smutno jak się nic nie stworzy :-(.


Podobne postybeta
Najprostszy OCR ;-)
[Updated] Czytanie Pocketa ;-)
Nie jest dobrze ;-)
Manipulowanie statystyką
Całkujący Dart ;-)