Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 135

 
Vict:

Siete molto premurosi, grazie. Ho fatto un errore, non ho messo le parentesi, quindi avrei usato la funzione "sleale".

ZS: apportate correzioni al post originale.

Si prega di spiegare perché questa costruzione è migliore di una banale rand()%max.

ZS: Capisco cosa vuoi dire.
Bene allora - cosa succede se max>32767? La vostra funzione è di tipo uint, ma genera lo stesso massimo di rand(), cioè 32767

È meglio usare qualcosa come

ulong RandULong(ulong max=ULONG_MAX) {return(((ulong)rand()<<60)|((ulong)rand()<<45)|((ulong)rand()<<30)|((ulong)rand()<<15)|(ulong)rand())%max;}
 
Vict:

Siete molto premurosi, grazie. Ho fatto un errore, non ho messo le parentesi, quindi userei la funzione "sleale".

ZS: apportate correzioni al post originale.

Vi rendete conto che se qualcuno vuole usare la vostra onesta funzione e scrivere get_rand(10), funzionerà 3276 volte più lento di rand()%10

 
Nikolai Semko:

Bene allora - cosa succede se max>32767? Dopo tutto, la vostra funzione è di tipo uint, ma genera il massimo che rand(), cioè 32767.

è meglio usare qualcosa come

E MathRand() restituisce int, cosa succede se qualcuno si aspetta un numero con sei zeri? Contando su un certo livello di pubblico. Qui, voi stessi sapete come ottenere > 32767.

Spesso scrivono rand()%3 senza pensarci due volte e poi vedono il mio messaggio e si rendono conto che sposta le probabilità.

Vi rendete conto che se qualcuno vuole usare la vostra onesta funzione e scrivere get_rand(10), funzionerà 3276 volte più lento di rand()%10

Beh sì, molto lento, per un ciclo di un milione di chiamate un callback mentre avverrà circa 300 volte. Se i vostri programmi consistono in for() nudi in cui get_rand() si agita, questo sarebbe critico, credo.

E vi rendete conto che lo scheduler dell'os occupa molto tempo della CPU e rallenta l'esecuzione in modo sproporzionato rispetto a rand()? Se avete tanta fretta, avete bisogno di un qualche tipo di dose.

 
Vict:

E MathRand() restituisce int, cosa succede se qualcuno si aspetta un numero con sei zeri? Conto su un certo livello di pubblico. Qui, voi stessi sapete come ottenere > 32767.

Spesso scrivono rand()%3 senza pensarci due volte e poi vedono il mio messaggio e si rendono conto che ci sarà uno spostamento di probabilità.

Beh sì, molto lento, per un ciclo di un milione di chiamate un callback mentre avverrà circa 300 volte. Se i vostri programmi consistono in for() nude in cui get_rand() si agita, questo sarebbe critico, credo.

E vi rendete conto che lo scheduler dell'os occupa molto tempo della CPU e rallenta l'esecuzione in modo sproporzionato rispetto a rand()? Se avete tanta fretta, avete bisogno di un qualche tipo di dose.

La velocità delle funzioni è fondamentale nell'ottimizzazione. E non si tratta dello scheduler e del DOS.
 
Vict:

E MathRand() restituisce int, cosa succede se qualcuno si aspetta un numero con sei zeri? Conto su un certo livello di pubblico. Qui, voi stessi sapete come ottenere > 32767.

Spesso scrivono rand()%3 senza pensare e vedono il mio messaggio e si rendono conto che questo sposterà le probabilità.

Beh sì, molto lento, per un ciclo di un milione di chiamate un callback mentre avverrà circa 300 volte. Se i vostri programmi consistono in for() nudi in cui get_rand() si agita, questo sarebbe critico, credo.

E vi rendete conto che lo scheduler dell'os occupa molto tempo della CPU e rallenta l'esecuzione in modo sproporzionato rispetto a rand()? Se avete tanta fretta, avete bisogno di un qualche tipo di dose.

Non abbiate paura di ammettere i vostri errori, non c'è niente di spaventoso o umiliante in questo. Tutti facciamo degli errori. È normale.
È molto più facile e più utile in termini di percezione della comunità dire: "Sì, ho sbagliato". Grazie". invece di cercare di trovare delle scuse.

Questo funziona molto più velocemente e in modo più flessibile:

ulong randUlong(ulong max=ULONG_MAX)
  {
   static bool f=true;
   if(f) {f=false; srand(GetTickCount());}
   return(((ulong)rand()<<60)|((ulong)rand()<<45)|((ulong)rand()<<30)|((ulong)rand()<<15)|(ulong)rand())%max;
  }

Puoi velocizzarlo se lo ricodifichi da ulong a uint, se non hai bisogno di grandi numeri (hai bisogno di 3 rand() invece di cinque).

 
Nikolai Semko:

Non abbiate paura di ammettere i vostri errori - non c'è niente di spaventoso e umiliante in questo. Tutti facciamo degli errori. Non c'è problema.
È molto più facile e più utile per la comunità dire: "Sì, mi sono sbagliato". Grazie". Invece di cercare di giustificarsi.

Dopo tutto, questa opzione funziona molto più velocemente e universalmente:

Può anche essere velocizzato ricodificando da ulong a uint, se non avete bisogno di grandi numeri (3 rand() invece di cinque).

Quindi non siete confusi dall'iniquità della vostra implementazione (in termini di velocità, a proposito, sarà molto più lenta)? Fai come vuoi.

Zy: disonestà - generare diversi numeri di gamma con diverse probabilità.
 
Vict:

Quindi non siete confusi dall'iniquità della vostra implementazione (sarà molto più lenta in termini di velocità, tra l'altro)? Fai come vuoi.

Zy: la disonestà sta generando diversi numeri di gamma con diverse probabilità.
Dici sul serio?
 
Why do people say there is modulo bias when using a random number generator?
Why do people say there is modulo bias when using a random number generator?
  • 2012.06.11
  • user1413793user1413793 5,32651933
  • stackoverflow.com
I have seen this question asked a lot but never seen a true concrete answer to it. So I am going to post one here which will hopefully help people understand why exactly there is "modulo bias" when using a random number generator, like in C++.
 
Quindi sei disposto a dare fuoco a una banconota da 100 dollari per trovare una monetina arrotolata sotto il letto?
 
Nikolai Semko:
Quindi sei disposto a dare fuoco a una banconota da 100 dollari per trovare una monetina arrotolata sotto il letto?

Non dovresti sottovalutare il ruolo delle probabilità. A multimilioni di iterazioni questi "centesimi arrotolati" ti costeranno cifre abbastanza tangibili. Inoltre, il tuo codice è ovviamente irrazionale a piccoli intervalli (fare costantemente cinque chiamate a rand() è esattamente il "bruciare la nota")

Sei mesi fa questo argomento era già stato discusso sul forum, avevo suggerito questa opzione:

Forum sul trading, sistemi di trading automatico e strategie di trading di prova

Come ottenere un numero casuale in un intervallo di profondità N?

Alexey Navoykov, 2018.12.31 01:25

Il mio ultimo codice si è rivelato errato. Mi sono fatto troppi problemi con le cifre, qui c'è la variante giusta e più concisa allo stesso tempo:

ulong RandomLong(ulong range)
{
 #define _MAXRND(range, rnd_range)  ((rnd_range) - ((rnd_range)-range)%range - 1) 
 #define _RND (ulong)rand()
  ulong rnd, max, const bit=1;
  if (range <= bit<<15) { if (!range) return0;  max=_MAXRND(range, 1<<15);  while((rnd=_RND) > max);  return rnd%range; }
  if (range <= bit<<30) { max=_MAXRND(range, bit<<30);  while((rnd=(_RND | _RND<<15)) > max);  return rnd%range; }
  if (range <= bit<<45) { max=_MAXRND(range, bit<<45);  while((rnd=(_RND | _RND<<15 | _RND<<30)) > max);  return rnd%range;  }
  if (range <= bit<<60) { max=_MAXRND(range, bit<<60);  while((rnd=(_RND | _RND<<15 | _RND<<30 | _RND<<45)) > max);  return rnd%range; }
                  else  { max=_MAXRND(range, bit<<64);  while((rnd=(_RND | _RND<<15 | _RND<<30 | _RND<<45 | _RND<<60)) > max);  return rnd%range; }
 #undef _RND               
 #undef _MAXRND
}
Motivazione: