Simulazione roulette

Mi stavo chiedendo su per giù che ritardo poteva avere un numero estratto alla roulette, in questo caso su 10000 estrazioni, ho tirato giù uno schetch, ma alla fine mi da tutti 0.
Aiutino? Grazie

int x[37];   // incremento i ritardi
int y[37];   // ci metto i ritardi massimi
long c;
int rnd;
void setup() {
  randomSeed(analogRead(0));
  Serial.begin(9600);
  Serial.println("  ");
}
void loop() {
  c++;      //contatore
  if (c == 10000) {
    fine(); //limite conteggio
  }
  rnd = random(0, 36);   // genero un numero casuale da 0 a 36
  for (int z = 0; z >= 36; z++) {
    x[z]++; //incremento il ritardo a tutti...
  }
  x[rnd]--;   //...tranne a quello estratto
  if (x[rnd] > y[rnd]) {
    y[rnd] = x[rnd];  // confronto il ritardo attuale del  numero estratto
    x[rnd] = 0;        //con il ritardo precedente ed eventualmente sostituisco
                        // e azzero il ritardo dell'ultimo estratto
  }
 
}
void fine() {
  for (int v = 0; v <= 36; v++) {
    Serial.print(v); Serial.print("  "); Serial.println(y[v]); // stampo tutti i numeri con il loro ritardo massimo
  }
}

Formatta in una forma leggibile

E' un problema statistico il tuo :wink:
Il ritardo minimo è zero il ritardo massimo è infinito.
Ora, ad ogni numero nel mezzo ha associata una probabilità.
Facendo una simulazione empirica trovi valore con un'altra probabilità :wink:
Vuoi per caso un sistema per cercare di vincere al lotto? Non esiste! :stuck_out_tongue:
Ad ogni estrazione ogni numero ha la stessa probabilità di uscire e questo ti frega sempre :wink:

maubarzi:
E' un problema statistico il tuo ;)..........lo so
Il ritardo minimo è zero il ritardo massimo è infinito....lo so
Ora, ad ogni numero nel mezzo ha associata una probabilità.
Facendo una simulazione empirica trovi valore con un'altra probabilità :wink:
Vuoi per caso un sistema per cercare di vincere al lotto? Non esiste! :P...no
Ad ogni estrazione ogni numero ha la stessa probabilità di uscire e questo ti frega sempre ;)...no me ne frega

...e aggiungo che la roulette è il gioco più equo di tutti, perche restituisce il circa il 97%
perchè paga 36 volte a fronte di 37 numeri.
L'ambo al lotto è più "ladro" perchè restituisce circa il 65% ...numeri possibili di ambi su 90 numeri 4005, ma siccome su una ruota vengono estratti 5 numeri, con 5 numeri si fanno 10 ambi, quindi il 4005 diventa 400,5 come probabilità; ma paga 250.
Vuoi che vada avanti dimostrandoti che so tutto sui giochi, o cercherai di dedicardti allo schetch in questione?

il tuo problema maggiore e che questa è sbagliata :slight_smile:

for (int z = 0; z >= 36; z++)

Sì ok capito
Attacco lavoro, poi ti spiego

Al di la di quello che dice Patrick, giusto ma non il cuore del problema
Tu testi se x[rnd] è maggiore
Ma quello è l'unico che NON hai incrementato.
Come farebbe a passare il test?

scusa standardoil... se corregge quel for i valori li incrementa tutti e 37 prima di fare la verifica...

Hai ragione, maledetto furbofono dal display piccolo..

in ogni caso il programma ha dei problemini :slight_smile:
il 36 da sempre risultato zero :slight_smile:

0  770
1  937
2  744
3  691
4  1003
5  750
6  909
7  825
8  614
9  711
10  1067
11  960
12  752
13  785
14  730
15  1001
16  721
17  777
18  714
19  964
20  855
21  722
22  936
23  813
24  780
25  815
26  875
27  707
28  787
29  709
30  805
31  742
32  856
33  926
34  875
35  653
36  0
  
0  687
1  843
2  741
3  746
4  912
5  791
6  996
7  1063
8  996
9  628
10  898
11  760
12  918
13  823
14  607
15  879
16  847
17  891
18  693
19  853
20  823
21  711
22  826
23  807
24  875
25  798
26  858
27  826
28  803
29  830
30  950
31  871
32  850
33  678
34  796
35  788
36  0
  
0  646
1  646
2  704
3  698
4  830
5  709
6  783
7  822
8  794
9  852
10  806
11  670
12  791
13  717
14  695
15  882
16  628
17  898
18  828
19  888
20  1170
21  807
22  791
23  717
24  993
25  769
26  856
27  875
28  781
29  790
30  769
31  751
32  874
33  761
34  685
35  1003
36  0
  
0  1098
1  821
2  862
3  925
4  955
5  822
6  891
7  920
8  809
9  779
10  731
11  827
12  1002
13  743
14  867
15  782
16  829
17  822
18  694
19  813
20  886
21  764
22  801
23  800
24  756
25  813
26  923
27  697
28  812
29  699
30  834
31  829
32  801
33  964
34  745
35  856
36  0
  
0  1098
1  821
2  862
3  925
4  955
5  822
6  891
7  920
8  809
9  779
10  731
11  827
12  1002
13  743
14  867
15  782
16  829
17  822
18  694
19  813
20  886
21  764
22  801
23  800
24  756
25  813
26  923
27  697
28  812
29  699
30  834
31  829
32  801
33  964
34  745
35  856
36  0

Serve random(0,37)
il random non arriva al valore

:wink:

non avevo notato :slight_smile:

il tandem non arriva al valore

allora meglio il monopattino :smiley:

La random() di Arduino non è esattamente il massimo (... ed è un dolce eufemismo) ...
... posso invece suggerire QUESTA libreria del nostro buon leo72? :slight_smile:

Guglielmo

P.S.: Occhio che usa il WatchDog e quindi richiede bootloader aggiornato (come spiegato al termine dell'articolo) o la MCU si pianta

Stilita:
Mi stavo chiedendo su per giù che ritardo poteva avere un numero estratto alla roulette...

Scusa se ho interpretato alla lettera il significato di questa frase e non ho invece capito quello che volevi realmente chiedere...
Non disturbo oltre e tra poco cancello gli interventi che hanno fatto danni

maubarzi:
Scusa se ho interpretato alla lettera il significato di questa frase e non ho invece capito quello che volevi realmente chiedere...
Non disturbo oltre e tra poco cancello gli interventi che hanno fatto danni

No, no, resta, quanti più siamo più belli sembriamo... :slight_smile:

Intanto che cerco di capire dov'è l'errore, volevo illustrarvi il progetto:
Voglio che Arduino giochi da solo alla roulette, puntando sia sui numeri che sulle altre
caselle, però la puntata deve avvenire dopo che un numero o un colore ha raggiunto un certo ritardo.
Vi anticipo che la risposta la so, perderà di media il 3% ad ogni puntata, perchè l'alea non ha memoria.
Lo stesso discorso varrebbe puntare sui numeri più frequenti...si perde, e sempre il 3%.

ps: il quel for incremento tutti i numeri, poi sottraggo una unità al numero estratto
quindi come se non l'avessi incrementato, poi lo confronto con il ritardo precedente e se quello attuale è maggiore aggiorno, poi visto che il numero è appena uscito gli azzero il ritardo...
Ho fatto una correzione, la "z" l'ho dichiarata globale, e non più locale, ma ancora non va

int x[37];   // incremento i ritardi
int y[37];   // ci metto i ritardi massimi
long c;
int rnd;
int z;
void setup() {
  randomSeed(analogRead(0));
  Serial.begin(9600);
  Serial.println("  ");
}
void loop() {
  c++;      //contatore
  if (c == 10000) {
    fine(); //limite conteggio
  }
  rnd = random(0, 37);   // genero un numero casuale da 0 a 36
  for ( z =0; z >= 36; z++) {
    x[z]++; //incremento il ritardo a tutti...
  }
  x[rnd]--;            //...tranne a quello estratto
  if (x[rnd] > y[rnd]) {
    y[rnd] = x[rnd];  // confronto il ritardo attuale del  numero estratto
    x[rnd] = 0;        //con il ritardo precedente ed eventualmente sostituisco
                        // e azzero il ritardo dell'ultimo estratto
  }
 
}
void fine() {
  for (int v = 0; v <= 36; v++) {
    Serial.print(v); Serial.print("  "); Serial.println(y[v]); // stampo tutti i numeri con il loro ritardo massimo
  }
}

Quello che ti hanno suggerito non aveva nulla a che fare con lo scope della variabile z, definirla globale in questo caso non serve a null, anzi.
Il problema è nel come hai scritto il for guardalo bene, se non ti salta all'occhio subito prova a guardare qui :wink:

fabpolli:
Quello che ti hanno suggerito non aveva nulla a che fare con lo scope della variabile z, definirla globale in questo caso non serve a null, anzi.
Il problema è nel come hai scritto il for guardalo bene, se non ti salta all'occhio subito prova a guardare qui :wink:

In effetti la "z" non la uso più e poteva benissimo essere dichiarata dentro, mi sto scervellando
il for sembra giusto...aspettate un altro po a suggerire altrimenti verrò squalificato (cit. R. Petri)

Altro indizio il for NON è giusto, se tu avessi guardato il codice presente nel link che ti ho proposto e tu lo avessi confrontato con il tuo for dovresti notarla al volo la differenza tra il tuo e quello del reference

Ok, ci sono arrivato.
Retaggi di Basic, il cui for "ragiona" diversamente...

Grazie per lo sprono, per quando riguarda la funzione random, l'articolo di Leo per
me è un po ostico, allora farei così:
All'avvio moltiplico A0*A1 che al massimo mi da 1.046.529
poi lo divido per esempio 105 ed ottengo dei millisecondi che andrò a mettere in un delay
che farà partire il programma dopo alcuni secondi dall'accensione, ma nel frattempo millis() si
sta già incrementando per i fatti suoi, quando il delay finisce la funzione random l'aggangio a millis()
che nel frattempo ha maturato un numero diverso da 0.
Può essere un po più casuale di quella standard?