Advertisement
rplantiko

Die verflixte Eins

Jan 17th, 2021 (edited)
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Strategien für "Die verflixte Eins"
  2. // Regeln siehe https://www.gruppenspiele-hits.de/wenig-material-spiele/Die-verflixte-Eins.html
  3.  
  4. const
  5. // Anzahl der Züge (Zufallsexperimente) pro Strategie
  6.       N = 10000000,
  7. // Werte für "Nach x Würfen aufhören"
  8.       NN = [1,2,3,4,5,6,7,8,9,10,15,20,50,100,Infinity],
  9. // Werte für "Nach Erreichen von mind. y Punkten aufhören"
  10.       MM = [5,10,15,16,17,18,19,20,21,22,23,24,25,30,40,50,Infinity];
  11.  
  12. // Die Parameter variieren und die Experimente durchführen:
  13. generateTable();
  14.  
  15. // Die zu verwendende Abbruchfunktion (Strategie):
  16. function cancelStrategy(maxRolls,limitSum=Infinity) {
  17.   return function(rolls,sum) {
  18.     return (rolls>=maxRolls || sum >= limitSum)
  19.   }
  20. }
  21.  
  22. // Ein einzelnes Spiel ("Zug")
  23. function move(cancelFn) {
  24.   let sum = 0;
  25.   for (let rolls=1;;rolls++) {
  26.     let n = rollDie();
  27.     if (n == 1) return 0;
  28.     sum += n;
  29.     if (cancelFn(rolls,sum)) return sum;
  30.   }
  31. }
  32.  
  33. // Sooft spielen, wie der Parameter moves angibt
  34. // Abbruchstrategie gemäß Parameter cancelFn
  35. function play(moves,cancelFn) {
  36.   let total = 0;
  37.   for (let i=0; i<moves;i++) {
  38.     total += move(cancelFn);    
  39.   }
  40.   return total/moves
  41. }
  42.  
  43. // Einen Würfel einmal werfen
  44. function rollDie() { return Math.ceil( Math.random()*6 )}
  45.  
  46. // Die Experimente durchführen und csv-Ergebnistabelle ausgeben
  47. function generateTable() {
  48.   const write = process.stdout.write.bind(process.stdout);
  49.   write([''].concat(MM).join(';') + "\n");
  50.   let rmax = 0;
  51.   for (let maxRolls of NN) {
  52.     write(maxRolls+";");
  53.     let col = [];
  54.     for (let limitSum of MM) {
  55.       let result = play(N,cancelStrategy(maxRolls,limitSum))
  56.       if (result > rmax) rmax = result;
  57.       col.push(result.toFixed(3))
  58.     }
  59.     write(col.join(';')+"\n");
  60.   }
  61.   write("Maximum: "+rmax.toFixed(5)+"\n");
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement