FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Alternative à la fonction rnd() de Panoramic Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
Alternative à la fonction rnd() de Panoramic Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Alternative à la fonction rnd() de Panoramic Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Alternative à la fonction rnd() de Panoramic Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Alternative à la fonction rnd() de Panoramic Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Alternative à la fonction rnd() de Panoramic Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Alternative à la fonction rnd() de Panoramic Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Alternative à la fonction rnd() de Panoramic Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Alternative à la fonction rnd() de Panoramic Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Alternative à la fonction rnd() de Panoramic Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Alternative à la fonction rnd() de Panoramic Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Alternative à la fonction rnd() de Panoramic Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Alternative à la fonction rnd() de Panoramic Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Alternative à la fonction rnd() de Panoramic Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Alternative à la fonction rnd() de Panoramic Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment :
Smartphone Xiaomi 14 – 512 Go- 6,36″ 5G ...
Voir le deal
599 €

 

 Alternative à la fonction rnd() de Panoramic

Aller en bas 
3 participants
AuteurMessage
Klaus

Klaus


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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptySam 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%)
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptySam 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.
Revenir en haut Aller en bas
Klaus

Klaus


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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptySam 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptySam 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 ?
Revenir en haut Aller en bas
JL35




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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptySam 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.
Revenir en haut Aller en bas
Klaus

Klaus


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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptySam 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jean_debord

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyMar 20 Juil 2010 - 10: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
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

Klaus


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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyMar 20 Juil 2010 - 10:48

Merci, je vais regarder cela...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jean_debord

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyMer 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.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
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

Klaus


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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyMer 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...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jean_debord

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyJeu 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
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

Klaus


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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyJeu 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.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jean_debord

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptySam 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.
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Klaus

Klaus


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

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyDim 8 Aoû 2010 - 19:46

OK, je vais vois ça...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
jean_debord

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyLun 9 Aoû 2010 - 15:45

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

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyVen 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
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
jean_debord

jean_debord


Nombre de messages : 1266
Age : 70
Localisation : Limoges
Date d'inscription : 21/09/2008

Alternative à la fonction rnd() de Panoramic Empty
MessageSujet: Re: Alternative à la fonction rnd() de Panoramic   Alternative à la fonction rnd() de Panoramic EmptyMar 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.
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
Alternative à la fonction rnd() de Panoramic
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Sleep ; une alternative de PAUSE
» Logithèque : une base de données en Panoramic pour Panoramic
» IDE Panoramic écrit en Panoramic
» PANORAMIC V 0.9.6 available / PANORAMIC V 0.9.6 disponible
» Logo Panoramic en Panoramic

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: