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
}
}
E' un problema statistico il tuo
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à
Vuoi per caso un sistema per cercare di vincere al lotto? Non esiste!
Ad ogni estrazione ogni numero ha la stessa probabilità di uscire e questo ti frega sempre
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à
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?
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?
La random() di Arduino non è esattamente il massimo (... ed è un dolce eufemismo) ...
... posso invece suggerire QUESTA libreria del nostro buon leo72?
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...
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
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
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?