30 votes

Les nombres aléatoires Haskell commencent soudainement à "converger" après des mois de fonctionnement

J'ai un programme serveur qui sélectionne au hasard 10 à partir d'un groupe de réseau de pairs pour accomplir une tâche. Le code qui génère l'aléatoire des indices des pairs est comme suit:

indices = let index = getStdRandom $ randomR (0, number_of_peers - 1)
          in sequence $ replicate 10 index

Le programme a été en cours d'exécution pendant des mois, générant des milliers de "indices" chaque jour, et a été fonctionne bien jusqu'à hier, quand j'ai remarqué que quelque chose a mal tourné: les nombres aléatoires générés semblent "convergent" à quelques doublons (le résultat est que le réseau de pairs sont lourdement chargés).

Pour voir le changement, ci-dessous, le journal du serveur il y a quelques jours:

peers selected: [55,47,80,74,183,85,04,33,72,58] 

et le journal d'aujourd'hui (comme vous pouvez le voir par les pairs, 53, 37 et 195 sont sélectionnée à plusieurs reprises):

peers selected: [53,53,37,37,37,37,195,195,195,21] 

Le programme est en cours d'exécution sur une version x86_64 version de Ubuntu 10.10.

10voto

Aufheben Points 503

Après enquête, ce qui s'avère être un bug embarrassant de ma propre: la racine de l'utilisateur sur ce serveur a une limite maximum de fichiers ouverts de 1024, ce qui est étonnamment faible (mais j'ai entendu dire que c'est la valeur par défaut sur Ubuntu). Lorsque le serveur a trop d'ouvrir des sockets, une partie du système commence à rejeter les pairs, ce qui rend leur statut "inactif". Le véritable "indices": le

indices = let index = getStdRandom $ randomR (0, M.size active - 1) in
              sequence $ replicate (n * 2) index

Je suis désolé si cette question est à l'origine de l'ennui ou de la confusion. Je vais essayer de poster de manière plus prudente la prochaine fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X