Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » [Basic] Formule d'aléatoire seedé efficace ?
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

[Basic] Formule d'aléatoire seedé efficace ?

Posté le 23/03/2020 15:37

Bonjour !
Pour mon projet Sunrise j'aurai besoin d'un système d'aléatoire seedé rapide.

Lephenixnoir a écrit :
État suivant :
MOD(214013S + 2531011, 4294967296 → S

Génération du nombre aléatoire :
MOD(Int(S ÷ 65536), 32768 → R


La formule d'Alexot est connue (même si je l'ai oubliée ), mais malheureusement lente et inappropriée au générations lourdes dont j'ai besoin
Les critères pris en compte ici sont : la vitesse du code, leur distribution, uniformité et leur période.
Si vous êtes parvenu à en programmer une et/ou connaissez des formules du genre, je les implémenterai en Basic et dresserai un tableau de performance sur ce topic. (J'ai oublié la formule d'Alexot, n'hésitez pas à la repost.)


どうもありがとう。
どうもありがとう。
Je ne parle pas japonais, copié-collé



Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 23/03/2020 15:43 | #


Pourquoi cherches-tu une formule faite maison aux propriétés mal étudiées et pas fiables ? Il y a plein de générateurs aléatoires bien étudiés dans la nature. À commencer par un LCG...

Tu prends n'importe quel LCG qui se calcule avec moins de 15 chiffres de précision (pour que ça plante par sur les modulos), tu auras une multiplication, une addition et un modulo par nombre généré, période de 2^16 ou peut-être plus si t'as de la chance (faut que ça se calcule avec 15 chiffres, donc 2^32 c'est pas évident), et du coup une distribution uniforme sur l'ensemble de valeurs considéré.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm Hors ligne Labélisateur Points: 11634 Défis: 176 Message

Citer : Posté le 23/03/2020 15:52 | #


Pour le modulo, je rappelle l'existence de MOD_Exp(a, b, c) qui calcule a^b % c

Edit :
Chuis con, pour un LCG ça sert pas à grand chose.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 23/03/2020 15:53 | #


Merci beaucoup !
Si j'ai bien compris, un LCG est juste une formule avec des paramètres ?
J'ai encore à tester, mais de ce que j'ai compris le code serait juste :
//untested LCG prototype
//S is seed
MOD(AS + C, M → S

Avec A, C et M des valeurs à choisir ?
ouais ouais
Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 23/03/2020 15:57 | #


Voilà, mais tu les choisis pas, tu prends des choses qui ont déjà été utilisées. Tu as aussi oublié que S n'est pas le nombre aléatoire, c'est juste une partie des bits.

Par exemple, tu peux prendre A=214013, C=2531011 et M=2^32. Ton nombre aléatoire c'est les bits 16 à 30 de S donc ça va entre 0 et 32768. (C'est des paramètres présents dans MSVC.)
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 23/03/2020 16:03 | #


Merci, mais dans ce cas là comment extraire cette partie des bits de façon efficace ?
Vu la vitesse du Basic je me demande si ça va passer
ouais ouais
Lephenixnoir Hors ligne Administrateur Points: 24235 Défis: 170 Message

Citer : Posté le 23/03/2020 16:11 | #


État suivant :
MOD(214013S + 2531011, 4294967296 → S

Génération du nombre aléatoire :
MOD(Int(S ÷ 65536), 32768 → R

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Kikoodx Hors ligne Ancien labélisateur Points: 3011 Défis: 11 Message

Citer : Posté le 23/03/2020 16:13 | #


Merci beaucoup
Je met ton code dans le post principal.
ouais ouais

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 103 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd