Caractéristiques du langage mql5, subtilités et techniques - page 135

 
Vict:

Vous êtes très prévenant, merci. J'ai fait une erreur, je n'ai pas mis de parenthèses, j'aurais utilisé la fonction "injuste".

ZS : corrections apportées au message original.

Veuillez expliquer pourquoi cette construction est meilleure qu'un rand()%max trivial.

ZS : Je vois ce que tu veux dire.
Alors, que faire si max>32767 ? Votre fonction est de type uint, mais génère le même maximum que rand(), c'est-à-dire 32767.

Vous feriez mieux d'utiliser quelque chose comme

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

Vous êtes très prévenant, merci. J'ai fait une erreur, je n'ai pas mis de parenthèses, donc j'utiliserais la fonction "injuste".

ZS : corrections apportées au message original.

Vous réalisez que si quelqu'un veut utiliser votre fonction honnête et écrire get_rand(10), cela fonctionnera 3276 fois plus lentement que rand()%10

 
Nikolai Semko:

Alors, que se passe-t-il si max>32767 ? Après tout, votre fonction est de type uint, mais génère un maximum que rand(), c'est-à-dire 32767.

il vaut mieux utiliser quelque chose comme

Et MathRand() renvoie int, que faire si quelqu'un s'attend à un nombre avec six zéros ? Je compte sur un certain niveau de public. Ici, vous savez vous-même comment obtenir > 32767.

Ils écrivent souvent rand()%3 sans y réfléchir à deux fois, puis voient mon message et réalisent que cela va modifier les probabilités.

Réalisez-vous que si quelqu'un veut utiliser votre fonction honnête et écrire get_rand(10), cela fonctionnera 3276 fois plus lentement que rand()%10

Eh bien oui, très lent, pour un cycle d'un million d'appels un rappel alors que se produira environ 300 fois. Si vos programmes consistent en des for() nus où get_rand() s'agite, ce serait critique, je suppose.

Et vous rendez-vous compte que l'ordonnanceur de l'OS prend beaucoup de temps CPU et ralentit l'exécution de façon disproportionnée par rapport à rand() ? Si vous êtes si pressé, vous avez besoin d'une sorte de dos.

 
Vict:

Et MathRand() renvoie int, que faire si quelqu'un s'attend à un nombre avec six zéros ? Je compte sur un certain niveau de public. Ici, vous savez vous-même comment obtenir > 32767.

Ils écrivent souvent rand()%3 sans y réfléchir à deux fois, puis voient mon message et réalisent qu'il y aura un changement de probabilité.

Eh bien oui, très lent, pour un cycle d'un million d'appels un rappel alors que se produira environ 300 fois. Si vos programmes consistent en des for() nus où get_rand() s'agite, ce serait critique, je suppose.

Et vous rendez-vous compte que l'ordonnanceur de l'OS prend beaucoup de temps CPU et ralentit l'exécution de façon disproportionnée par rapport à rand() ? Si vous êtes si pressé, vous avez besoin d'une sorte de dos.

La rapidité des fonctions est essentielle dans l'optimisation. Et ce n'est pas à propos du programmateur et du DOS.
 
Vict:

Et MathRand() renvoie int, que faire si quelqu'un s'attend à un nombre avec six zéros ? Je compte sur un certain niveau de public. Ici, vous savez vous-même comment obtenir > 32767.

Ils écrivent souvent rand()%3 sans réfléchir et voient mon message et réalisent que cela va modifier les probabilités.

Eh bien oui, très lent, pour un cycle d'un million d'appels un rappel alors que se produira environ 300 fois. Si vos programmes consistent en des for() nus où get_rand() s'agite, ce serait critique, je suppose.

Et vous rendez-vous compte que l'ordonnanceur de l'OS prend beaucoup de temps CPU et ralentit l'exécution de façon disproportionnée par rapport à rand() ? Si vous êtes si pressé, vous avez besoin d'une sorte de dos.

N'ayez pas peur d'admettre vos erreurs, il n'y a rien d'effrayant ou d'humiliant à cela. Nous faisons tous des erreurs. C'est normal.
Il est beaucoup plus facile et plus utile en termes de perception par la communauté de dire "Oui, j'avais tort". Merci." au lieu d'essayer de trouver des excuses.

Cela fonctionne beaucoup plus rapidement et de manière plus souple :

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;
  }

Vous pouvez accélérer le processus en le recodant de ulong en uint, si vous n'avez pas besoin de grands nombres (vous avez besoin de 3 rand() au lieu de cinq).

 
Nikolai Semko:

N'ayez pas peur d'admettre vos erreurs - il n'y a rien d'effrayant ni d'humiliant à cela. Nous faisons tous des erreurs. C'est bon.
C'est beaucoup plus facile et plus utile pour la communauté de dire "Oui, j'avais tort". Merci." Au lieu d'essayer de vous justifier.

Après tout, cette option fonctionne beaucoup plus rapidement et de manière plus universelle :

On peut aussi accélérer le processus en recodant de ulong en uint, si l'on n'a pas besoin de grands nombres (3 rand() au lieu de cinq).

Vous n'êtes donc pas troublé par l'injustice de votre mise en œuvre (en termes de vitesse, soit dit en passant, elle sera beaucoup plus lente) ? Faites comme vous voulez.

Zy : malhonnêteté - générer des nombres de fourchettes différentes avec des probabilités différentes.
 
Vict:

Vous n'êtes donc pas troublé par le caractère inéquitable de votre mise en œuvre (qui sera d'ailleurs beaucoup plus lente en termes de vitesse) ? Faites comme vous voulez.

Zy : la malhonnêteté consiste à générer des chiffres de portée différente avec des probabilités différentes.
Vous êtes sérieux ?
 
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++.
 
Vous êtes donc prêt à mettre le feu à un billet de 100 dollars pour trouver une pièce de 10 cents roulée sous le lit ?
 
Nikolai Semko:
Vous êtes donc prêt à mettre le feu à un billet de 100 dollars pour trouver une pièce de 10 cents roulée sous le lit ?

Vous ne devriez pas sous-estimer le rôle des probabilités. À plusieurs millions d'itérations, ces "centimes roulés" vous coûteront des chiffres tout à fait tangibles. De plus, votre code est manifestement irrationnel pour les petites plages (faire constamment cinq appels à rand() est exactement le "brûlage de la note").

Il y a six mois, ce sujet était déjà discuté sur le forum, j'avais suggéré cette option :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Comment obtenir un nombre aléatoire dans un intervalle de N-profondeurs ?

Alexey Navoykov, 2018.12.31 01:25

Mon dernier code s'est avéré être incorrect. J'ai fait trop d'histoires avec les chiffres. Voici une variante correcte et plus concise en même temps :

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
}