FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Compilateur FBPano
par jean_debord Aujourd'hui à 11:07

» Documentation de KGF
par Klaus Hier à 22:52

» Zoom sur une portion d'écran
par JL35 Hier à 21:51

» KGF_dll - nouvelles versions
par Klaus Hier à 21:31

» double guillemets "" dans un EDIT
par pascal10000 Hier à 21:08

» Recherche d'une expression dans un source
par Marc 37 Hier à 13:08

» Tracer une grille n'importe où sur l'écran
par JL35 Dim 19 Nov 2017 - 22:14

» TourD Version 2
par Klaus Sam 18 Nov 2017 - 23:58

» La métamatière et le peuple
par JL35 Ven 17 Nov 2017 - 21:18

» Capture d'une zone de l'écran total
par JL35 Ven 17 Nov 2017 - 18:41

» Logiciel de soutien scolaire en langues.
par Pedro Alvarez Ven 17 Nov 2017 - 11:49

» qui peut résoudre mon prb
par pascal10000 Jeu 16 Nov 2017 - 17:30

» évènements et objets système : listage automatique
par Jean Claude Jeu 16 Nov 2017 - 11:15

» Panoramic et la reconnaissance vocale.
par papydall Jeu 16 Nov 2017 - 3:45

» Bizzarerie dans Edge
par Marc 37 Mer 15 Nov 2017 - 17:45

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2017
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
27282930   
CalendrierCalendrier

Partagez | 
 

 Alternative à la fonction rnd() de Panoramic

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Klaus

avatar

Nombre de messages : 10126
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Alternative à la fonction rnd() de Panoramic   Sam 26 Juin 2010 - 17: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%)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5991
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Sam 26 Juin 2010 - 17: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10126
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Sam 26 Juin 2010 - 17: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5991
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Sam 26 Juin 2010 - 17: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 ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5991
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Sam 26 Juin 2010 - 18: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10126
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Sam 26 Juin 2010 - 19: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jean_debord

avatar

Nombre de messages : 762
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Mar 20 Juil 2010 - 11:44

Si cela vous intéresse, j'ai adapté le genérateur "Mersenne Twister" qui est considéré comme l'un des plus fiables.

Voici la version Delphi :

http://dmath.svn.sourceforge.net/viewvc/dmath/units/uranmt.pas?revision=9&view=markup

Et la version FreeBASIC :

http://fbmath.svn.sourceforge.net/viewvc/fbmath/modules/random/mt.bas?revision=2&view=markup

Il est facile de convertir ces codes en DLL.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

avatar

Nombre de messages : 10126
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Mar 20 Juil 2010 - 11:48

Merci, je vais regarder cela...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jean_debord

avatar

Nombre de messages : 762
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Mer 21 Juil 2010 - 11: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.zip

Pour 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]




Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

avatar

Nombre de messages : 10126
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Mer 21 Juil 2010 - 15: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jean_debord

avatar

Nombre de messages : 762
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Jeu 22 Juil 2010 - 12: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

avatar

Nombre de messages : 10126
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Ven 23 Juil 2010 - 0: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jean_debord

avatar

Nombre de messages : 762
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Sam 7 Aoû 2010 - 9:22

Merci, ça marche avec stdcall.

La nouvelle DLL (avec un programme de démonstration) est disponible sur le lien donné précédemment.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

avatar

Nombre de messages : 10126
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Dim 8 Aoû 2010 - 20:46

OK, je vais vois ça...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
jean_debord

avatar

Nombre de messages : 762
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Lun 9 Aoû 2010 - 16:45

Malheureusement, ça ne marche plus quand on programme la DLL en FreeBASIC (voir mon message sur http://panoramic.free-boards.net/a-l-aide-f6/adrarray0-t1034.htm)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

avatar

Nombre de messages : 762
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Ven 13 Aoû 2010 - 18: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

avatar

Nombre de messages : 762
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Mar 17 Aoû 2010 - 9: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Contenu sponsorisé




MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   

Revenir en haut Aller en bas
 
Alternative à la fonction rnd() de Panoramic
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: Activité des sites créés par les Panoramiciens. :: Le site de Klaus-
Sauter vers: