| Alternative à la fonction rnd() de Panoramic | |
|
|
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Alternative à la fonction rnd() de Panoramic Sam 26 Juin 2010 - 16:01 | |
| J'ai mis une nouvelle version de ma DLL en ligne, avec une fonction qui est une alternative à la fonction rnd. Selon mes mesures, le taux de convergence sur un grand nombre de tirages est un peu meilleur que celui de rnd.
On appelle cette fonction par: res% = DLL_call1("RandomValue",maxi%) en remplacement de res% = rnd(maxi%)
| |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Sam 26 Juin 2010 - 16:32 | |
| Décidément, ta dll va devenir un système d'exploitation à elle toute seule ! J'ai évidemment essayé le générateur de nombre aléatoire (je tire de 1 à 30 pour que ça tienne dans l'affichage de fin): - Code:
-
DIM n(30), i, a%
dll_on "C:\Langages\Panoramic\KGF.dll"
FOR i = 1 TO 10000 a% = DLL_call1("RandomValue",30) ' a% = INT(RND(30)) + 1 n(a%) = n(a%) + 1 NEXT i
FOR i = 1 TO 30 PRINT STR$(i) + ": " + STR$(n(i)) NEXT i END et là j'ai un phénomène curieux: la répartition est (relativement) correcte, mais plus grave il y a des trous répartis de manière régulière (de 6 en 6), et différente suivant les tirages: 1er tirage: pas de 4, 10, 16, 22, 28 2ème tirage: pas de 3, 0, 15, 21, 27 3ème tirage: pas de 2, 8, 14, 20, 26 4ème irage: pas de 1, 7, 13, 19, 25 5ème tirage: pas de 6, 12 ... et ainsi de suite. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Sam 26 Juin 2010 - 16:54 | |
| As-tu essayé le petit programme que j'ai mis en ligne ? Les statistiques sont parlantes.
J'ai essayé ton programme, et chez moi, il ne reproduit pas les "trous" dont ut parles. Tous les numéros sont tirés. As-tu essayé d'augmenter le nombre de tirages, comme dans mon programme d'essai . Ceci dit, même avec 10.000 tirages, je n'ai pas de trous. Curieux... | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Sam 26 Juin 2010 - 16:58 | |
| Je n'ai pas essayé ton programme, effectivement les trous peuvent disparaître si on augmente, à 100000 tirages par exemple, mais pour 10000 c'est quasi systématique (mais pas à 100%), curieux... Et les écarts de tirage peuvent être assez importants: - Code:
-
DIM n%(30), i%, a%, nti, ec, mini%, maxi%
dll_on "C:\Langages\Panoramic\KGF.dll"
nti = 10000: ' nombre de tirages FOR i% = 1 TO nti a% = DLL_call1("RandomValue",30) ' a% = INT(RND(30)) + 1 n%(a%) = n%(a%) + 1 NEXT i%
FOR i% = 1 TO 30 PRINT STR$(i%) + ": " + STR$(n%(i%)) NEXT i% ' Répartition des tirages mini% = nti: maxi% = 0 FOR i% = 1 TO 30 IF n%(i%) > 0 IF n%(i%) > maxi% THEN maxi% = n%(i%) IF n%(i%) < mini% THEN mini% = n%(i%) END_IF NEXT i% ec = 100*(maxi%-mini%)/mini%: ec = INT(10*ec)/10 PRINT "Mini= " + STR$(mini%), " Maxi= " + STR$(maxi%), " écart = "+STR$(ec)+" %" END J'ai essayé jusqu'à 500000, le nombre de tirages nuls diminue, mais il y a toujours une très nette faiblesse en tirages avec cette périodicité de 6. Je ne vois pas du tout ce qui pourrait produire ça dans mon programme d'essai... C'est quand même curieux, parce que si j'essaie ton programme de test le résultat est satisfaisant, qu'est-ce qui ne va pas dans le mien ? | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Sam 26 Juin 2010 - 17:53 | |
| Tout de même Klaus, si je reprends ton programme et que je fais varier le nombre de tirages et le nombre maximum, il y a des anomalies:
Pour 10000 je retrouve des nombres non tirés, et si je mets 30 au lieu de 49 je retrouve ma périodicité de 6 "zéro tirage".
Curieusement le phénomène s'accentue quand on diminue le nombre maxi, alors qu'au contraire, plus l'écart à tirer est petit meilleure devrait être la répartition. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Sam 26 Juin 2010 - 18:06 | |
| OK, je vais voir la cause. Pour le moment, avec 10.000 tirages, je n'ai aucun trou, ni avec ton code, ni avec le mien. Mais je vais approfondir. | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Mar 20 Juil 2010 - 10:44 | |
| | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Mar 20 Juil 2010 - 10:48 | |
| Merci, je vais regarder cela... | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Mer 21 Juil 2010 - 10:54 | |
| J'ai fait une DLL à partir de la version Delphi. Vous la trouverez ici : http://www.unilim.fr/pages_perso/jean.debord/lang/ranmt.zipPour l'utiliser dans PANORAMIC, c'est très simple : - Code:
-
dll_on ranmt
dim i%
for i% = 1 to 10 print dll_call0("IRanMT") next i%
dll_off
La fonction IRanMT produit un entier aléatoire de 32 bits dans l'intervalle : [-2^31 .. 2^31 - 1] soit : [-2147483648 .. 2147483647] | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Mer 21 Juil 2010 - 14:43 | |
| J'ai téléchargé et je vais comparer avec le mien...
J'ai vu. Ca marche très bien, et la DLL est facilement utilisable. Mais je voulais faire autre chose. Je voulais offrir une alternative à la fonction rnd(v), v définissant l'intervalle [0,v]. J'ai trouvé que la convergence de la fonction rnd n'était pas fameuse, et j'ai rendu la fonction de Delphi accessible. La convergence est nettement meilleure avec ma version.
Mais je ne peux pas faire la même chose avec celui que tu proposes: dès que je tente d'adapter le résultat à mon intervalle, je perds le bénéfice de l'aléatoire et je tombe dans quelque chose dont la convergence est mauvaise. Dommage... | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Jeu 22 Juil 2010 - 11:27 | |
| J'ai ajouté 3 nouvelles fonctions à la DLL :
IRanMT1(N) : entier aléatoire sur [0, N]
IRanMT2(A, B) : entier aléatoire sur [A, B]
RRanMT : réel aléatoire sur [0, 1[
(le lien de téléchargement est le même)
Malheureusement, je n'ai pas réussi à utiliser ces fonctions avec PANORAMIC | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Jeu 22 Juil 2010 - 23:25 | |
| Pour mon problème, c'est la fonction IRanMT1 qui m'intéresse. J'ai essayé de l'utiliser, et j'ai une violation d'accès en boucle infinie. Je pense que ce qui cloche, c'est ceci: - Code:
-
function IRanMT1(N : RNG_IntType) : RNG_IntType; begin IRanMT1 := Trunc(RRanMT * (N + 1)); end;
à remplacer par - Code:
-
function IRanMT1(N : RNG_IntType) : RNG_IntType; stdcall; export; begin result := Trunc(RRanMT * (N + 1)); end;
Je n'ai pas eu le temps de voir si le stdcall et export est géré à un autre endroit du source, mais je sais que pour Panoramic, les règles suivantes sont à respecter: 1. il n'y a que des fonctions, pas de procédures appelables dans une DLL pour Panoramic 2. le résultat est obligatoirement un integer signé 32 bits, retourné par la variable interne result. La façon dont tu transmets le résultat, ressemble à ce qui est d'usage pour Fortran ou d'autres langages, mais ne correspond pas à Panoramic. | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Sam 7 Aoû 2010 - 8:22 | |
| Merci, ça marche avec stdcall.
La nouvelle DLL (avec un programme de démonstration) est disponible sur le lien donné précédemment. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Dim 8 Aoû 2010 - 19:46 | |
| | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Lun 9 Aoû 2010 - 15:45 | |
| | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Ven 13 Aoû 2010 - 17:52 | |
| Les problèmes de la version FreeBASIC ayant été résolus grâce à D. J. Peters (que je remercie !), j'y ai ajouté une fonction RanMT qui retourne un réel aléatoire dans [0,1) L'appel se fait ainsi : - Code:
-
dim i%, x dll_on "ranmt.dll" i% = dll_call1("RanMT", adr(x)) print x dll_off
| |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Alternative à la fonction rnd() de Panoramic Mar 17 Aoû 2010 - 8:43 | |
| J'ai repris le programme de JL35 en lui ajoutant un test de khi-2 pour comparer les méthodes. - Code:
-
DIM nc%, nt%, f, i%, a%, khi2, diff
nc% = 30 : ' Nombre de classes
nt% = 10000 : ' Nombre de tirages
f = nt% / nc% : ' Effectif théorique de chaque classe
dim n%(30) : ' Effectifs observés
' dll_on "KGF.dll"
dll_on "ranmt.dll"
FOR i% = 1 TO nt%
' a% = INT(RND(nc%)) + 1 : ' Panoramic
' a% = DLL_call1("RandomValue", nc%) : ' KGF
a% = DLL_call2("IRanMT2", 1, nc%) : ' RanMT
n%(a%) = n%(a%) + 1
NEXT i%
dll_off
FOR i% = 1 TO nc%
PRINT STR$(i%) + ": " + STR$(n%(i%))
NEXT i%
khi2 = 0
FOR i% = 1 TO nc%
diff = n%(i%) - f
khi2 = khi2 + diff * diff / f
NEXT i%
PRINT
PRINT "khi2 = "; khi2; " (valeur seuil = 42.56 pour 29 d.d.l. et risque 5%)"
END
Avec KGF et RanMT les résultats sont corrects mais pas avec le générateur de Panoramic pour lequel le khi-2 obtenu est très supérieur à la valeur seuil. | |
|
| |
Contenu sponsorisé
| Sujet: Re: Alternative à la fonction rnd() de Panoramic | |
| |
|
| |
| Alternative à la fonction rnd() de Panoramic | |
|