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
» Mise à jour PANOMAND
par jean_debord Aujourd'hui à 11:33

» Pourquoi le compilateur stagne
par Jicehel Aujourd'hui à 11:13

» Immortaliser les photos de famille
par jjn4 Hier à 18:29

» Concours de Morpions
par jjn4 Hier à 18:11

» Compilateur FBPano
par jean_debord Hier à 10:12

» Tout est tranquille
par Jean Claude Ven 22 Sep 2017 - 21:41

» Texte en gif animé
par JL35 Ven 22 Sep 2017 - 13:29

» BasicEditor
par Yannick Mer 20 Sep 2017 - 17:17

» Simuler l’appui d'une touche ou combinaison de touches.
par pascal10000 Lun 18 Sep 2017 - 19:30

» Utilisation de HVIEWER pour afficher des images
par papydall Lun 18 Sep 2017 - 17:43

» Panoramic et les gifs animés.
par papydall Lun 18 Sep 2017 - 16:32

» recover source
par pascal10000 Dim 17 Sep 2017 - 14:21

» Recent dans vos menu
par Jean Claude Sam 16 Sep 2017 - 11:41

» Comment centrer un texte 3D.
par pascal10000 Ven 15 Sep 2017 - 20:20

» Carte interface 16 entrées et 16 sorties
par Jicehel Ven 15 Sep 2017 - 16:30

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
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 : 10062
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 : 5951
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 : 10062
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 : 5951
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 : 5951
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 : 10062
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 : 752
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 : 10062
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 : 752
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 : 10062
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 : 752
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 : 10062
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 : 752
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 : 10062
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 : 752
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 : 752
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 : 752
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
 Sujets similaires
-
» EDI réalisé entièrement en Panoramic
» EDI réalisé entièrement en Panoramic
» pas un panoramic mais utilitaires delphi.
» Programmes Panoramic en ligne de commande
» lol, panoramic dans google ;)

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: