|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 131
|
[C]algoritmo c per generare random,evitando la funzione rand()
la funzione rand() di c mi dà un problema anomalo se la inserisco in un determinato blocco del progetto..
ho provato a farmi una funzione che genera numeri random ma ho un pò arrangiato quello che mi ricordavo da un codice visto in passato,adesso il programma gira,ma l'algoritmo non è corretto ...qualcuno saprebbe dirmi se conosce un algoritmo più preciso di questo?..oppure dei link utili a riguardo unsigned int nn = 4545; float random() { nn = (nn*12345 +1) & 0X7fff; return (float) nn/0X7fff; } grazie! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
come fa ad essere random sta funzione? parti da una costante, ti darà sempre lo stesso risultato...
se vuoi un qualcosa di più casuale intercetta in qualche modo l'ora di sistema e usala come base per qualche calcolo che restituisca il range di valori corretto. almeno sei sicuro che due esecuzioni del programma daranno con buona probabilità due risultati diversi |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 131
|
no asp,considera che l'inizializzazione fuori viene fatta una volta sola,poi la funzione viene chiamata a ripetizione da una callback..
ho visto un algoritmo simile ma non ricordo bene com'era esattamente..se avete idee a riguardo fate sapere,grazie! |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 2004
Città: Una palla di fango abitata da scimmie sognatrici
Messaggi: 128
|
Si ma se l'inizializzazione è una costante ogni volta che eseguirai l'applicazione genererai sempre la stessa sequenza di numeri.
__________________
"Contro la stupidità gli stessi dei lottano invano" Friedrich Schiller "Chi rinuncia alla libertà per raggiungere la sicurezza non merita né la libertà né la sicurezza" Benjamin Franklin "Guardati dalla furia di un uomo tranquillo" John Dryden |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
nn = time(NULL);
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ci sono libri e libri sulla generazione di sequenze pseudo-random. Con algoritmi fatti in casa, a meno che tu non sia un matematico (o qualcuno che ha studiato la materia), difficilmente riuscirai ad ottenere qualcosa di valido.
Ad esempio...la prima cosa che mi viene in mente è che quell'algoritmo possa essere convergente ad un determinato valore. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Mmh ad occhio convergente direi di no, forse puoi avere problemi di periodicità visto che usi un and binario... In qualsiasi caso, come è stato già detto, per ottenere una sequenze pseudocasuale devi comunque partire da un seed generato casualmente (ad esempio mediante l'orologio di sistema), non puoi partire da una costante, pena riottenere ogni volta sempre la stessa sequenza
__________________
Il sole è giallo |
|
|
|
|
|
#8 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Forse puoi trovare qualche idea QUI.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
|
cerca l'algoritmo del marsenne twister o una libreria che lo implementi, è ritenuto uno degli algoritmi migliori per generare numeri pseudocasuali.
la funzione rand() lasciala perdere http://random.mat.sbg.ac.at/generators/ se ti servono numeri casuali: http://www.random.org/ |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Quote:
Codice:
0.000000 0.000031 0.376782 0.225929 0.002564 0.646168 0.705527 0.463851 0.063723 0.632130 0.405347 0.854122 0.808496 0.582934 0.101260 0.021699 0.861843 0.123569 0.418287 0.591662 0.848781 Futili disquisizioni matematiche ovviamente
__________________
Il sole è giallo |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In effetti
|
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Jun 2007
Messaggi: 36
|
Prova questa:
Codice:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define S1MAX 2147483562
#define S2MAX 2147483398
float Rand(void);
void Srand(void);
long s1,s2;
void main(void)
{
int i;
Srand();
for(i=0;i<256;i++)
printf("%7.2f\n",Rand());
}
void Srand(void)
{
time_t t;
s1=(unsigned)time(&t);
s2=s1*s1;
if(s1<1||s1>S1MAX)
s1=(abs(s1)%S1MAX)+1;
if(s2<1||s2>S2MAX)
s2=(abs(s2)%S2MAX)+1;
}
float Rand()
{
long Z,k;
k=s1/53668;
s1=40014*(s1-k*53668)-k*12211;
if(s1<0)
s1+=S1MAX+1;
k=s2/52774;
s2=40692*(s2-k*52774)-k*3791;
if(s2<0)
s2+=S2MAX+1;
Z=s1-s2;
if(Z<1)
Z+=S1MAX;
return(Z*4.656613E-10);
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:31.




















