IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Générer un positif aléatoirement


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut Générer un positif aléatoirement
    Bonjour ,

    Je veux créer un algorithme qui génére un positif aléatoirement , puis s'arréte quand c'est fait .

    Je sais que je dois utiliser une boucle , mais je ne sais pas comment ?

    Avez-vous une piste , des idées ?

    En gros ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
        loop
               choix_positif : Positive ;
     
             --ensuite une valeur exacte positive est généré 
     
        exit loop

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Cette question est aussi mal posée qu'elle est insoluble.

    Voyons point par point.

    Je veux créer un algorithme qui génére un positif aléatoirement
    Tu veux créer un algorithme ? Les machines sont fabriquées pour obéir au doigt et à l'oeil. Elles sont donc incapables de créer un processus réellement aléatoire. Si ton objectif est cryptographique, il faut lire la documentation spécialisée.

    Tu veux probablement simplement utiliser la fonction de génération aléatoire imparfaite fournie par de nombreux langages de programmation ? Mais ici, c'est un sous-forum d'algorithmes. Le langage ne compte pas.

    , puis s'arréte quand c'est fait (...) je dois utiliser une boucle
    Contradictoire.
    Soit tu fais une opération unique, soit tu fais une boucle. Pas les deux.

    Je sais que je dois utiliser une boucle
    Où as-tu lu cela ?

    En gros ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        loop
               choix_positif : Positive ;
     
             --ensuite une valeur exacte positive est généré 
     
        exit loop
    En gros, moi Tarzan. Toi Jane ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    Bon , oublions le langage et le boucles .

    Je pense avoir une piste =
    https://fr.wikipedia.org/wiki/Indica...re_et_notation

    D'aprés mes cours elle était utilisée dans la cryptographie , et peut générer un nombre positif ou naturel .

    Maintenant , comment utiliser ces fonctions génératrices ?

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Quel est le but ?
    Pourquoi ne pas utiliser la fonction fournie par ton langage ?
    Pourquoi ne pas tirer des 0 et des 1 ?


    Je vais redire la même chose que précédemment mais autrement.
    Il faut casser le mythe : Les ordinateurs ne tirent pas de nombres aléatoires. On parle de "pseudo-aléatoires". Le processus est totalement déterministe. Mais on prend une part de l'information déterministe dont la logique nous échappe pour faire comme si c'était aléatoire.

    Exemple: je tire 1 si le nombre de millisecondes est impair et 0 s'il est pair. (Choisis ton horloge). J'obtiens:
    0110101011101010001101010101

    Et voilà! Un nombre apparemment totalement aléatoire !

    Tu veux échapper au "pseudo-" ? Tu ne peux pas.

    As-tu déjà entendu parlé de Blum Blum Shub ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Quel est le but ?
    Pourquoi ne pas tirer des 0 et des 1 ?
    Je code un programme qui doit afficher une ou plusieurs valeur String en fonction du nombre ou chiffre qu'il a généré aléatoirement , avant.

    Donc , pour ne pas compliquer les choses , il faut qu'il puisse choisir ce nombre ou chiffre dans une intervalle non binaire .


    Citation Envoyé par Flodelarab Voir le message
    Pourquoi ne pas utiliser la fonction fournie par ton langage ?
    Quelle fonction ? Peux-tu être plus spécifique ?
    Pour info , je code en Ada .


    Citation Envoyé par Flodelarab Voir le message
    Il faut casser le mythe : Les ordinateurs ne tirent pas de nombres aléatoires. On parle de "pseudo-aléatoires". Le processus est totalement déterministe. Mais on prend une part de l'information déterministe dont la logique nous échappe pour faire comme si c'était aléatoire.
    Aurais-tu un exemple avec des non-binaires ?

    Citation Envoyé par Flodelarab Voir le message
    As-tu déjà entendu parlé de Blum Blum Shub ?
    Jamais , et je n'ai aucune idée de comment l'utiliser .

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    En langage Ada, il y a la fonction random() qui répond à ton besoin.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  7. #7
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    En langage Ada, il y a la fonction random() qui répond à ton besoin.
    Dans quel package ?

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Dans quel package ? aucune idée, je n'ai jamais utilisé ADA, et je ne savais pas qu'il y avait une notion de package.
    Par contre, j'utilise parfois google ...
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    J'ai trouvé tbc92 , ce package est référencié :

    http://www.adaic.org/resources/add_c.../RM-A-5-2.html

    Je ferai un retour .

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Donc , pour ne pas compliquer les choses , il faut qu'il puisse choisir ce nombre ou chiffre dans une intervalle non binaire .
    Sais-tu ce que tu es en train de manipuler ? Ça s'appelle un ordinateur. C'est un gros boulier automatique.
    Les nombres sont des nombres.
    Les textes sont des nombres.
    Les images sont des nombres.
    Les vidéos sont des nombres.
    Les sons sont des nombres.
    Tout est nombre.
    Voilà pourquoi on parle de technologie numérique.
    Et la base d'expression de ces nombres n'est pas la base 10 comme pour les humains mais la base 2. Donc binaire.

    Il est impossible d'avoir un résultat non-binaire.

    Quelle fonction ? Peux-tu être plus spécifique ?
    Pour info , je code en Ada .
    Je ne connais pas Ada.
    Mais tu sembles avoir trouvé.

    Généralement, il y a deux fonctions à chercher:
    • Une fonction (genre random) qui est capable de donner un nombre et une suite de nombres.
    • Une fonction (genre randomize) qui est capable de changer le point de départ.
      Car, paradoxalement, si random génère des nombres aléatoires, il re-fournit la même séquence à chaque redémarrage du programme. Avec randomize, finies les ressemblances.


    À noter: Sous Linux, les fichiers /dev/random et /dev/urandom sont des "fichiers" fournissant des nombres aléatoires.

    Aurais-tu un exemple avec des non-binaires ?
    Par définition de l'ordinateur, c'est impossible.
    Mais peut-être peux-tu créer une fonction ayant pour ensemble des images ton ensemble des valeurs possibles ?

    Jamais , et je n'ai aucune idée de comment l'utiliser .
    En cliquant sur le lien donné, tu as toutes les explications. Mais si tu as trouvé ta fonction random, tu n'as peut-être pas besoin de cela.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Bonjour,

    Une autre question (qui a son importance), le nombre positif ci-dessous est-il valide ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123432345654389087656781234586345678456775323344556788909876432212345678908767654332123456754346780865431234556678767986434566656545456789900987654567854578765435789987578096433568974224678098765433457809876547689098778909098094545654567687651
    Cordialement.

  12. #12
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    J'ai beau chercher sur mon ami google, je ne trouve pas la définition d'un nombre valide ou d'un nombre invalide. C'est quoi, ça vient de sortir cette semaine ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Bah, c'est à toi de savoir selon ton besoin, ici, on n'est pas dans la partie random, on est dans la partie borne supérieur car l'ensemble des nombres positifs est infini.
    Cordialement.

  14. #14
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Générer un positif aléatoirement
    Bonsoir,

    Citation Envoyé par Flodelarab Voir le message
    As-tu déjà entendu parlé de Blum Blum Shub ?
    Le lien renvoie à un article intéressant, qui donne envie d'approfondir le sujet (pour moi difficile, compte tenu de mes lacunes), et d'effectuer des tests graphiques sur des séries de nombres pseudo-aléatoires: voilà de nouvelles idées de programmation !

    Citation Envoyé par Flodelarab Voir le message
    Il faut casser le mythe : Les ordinateurs ne tirent pas de nombres aléatoires. On parle de "pseudo-aléatoires". Le processus est totalement déterministe. Mais on prend une part de l'information déterministe dont la logique nous échappe pour faire comme si c'était aléatoire.

    Exemple: je tire 1 si le nombre de millisecondes est impair et 0 s'il est pair. (Choisis ton horloge). J'obtiens:
    0110101011101010001101010101
    Et voilà! Un nombre apparemment totalement aléatoire !
    Cette suite l'est - à quelques restrictions près, liées à aux conditions matérielles d'éxécution - parce que les résultats obtenus découlent de la rencontre de deux séries causales indépendantes: le fonctionnement de l'horloge interne, et l'appui sur la touche déclenchant la sortie du résultat. Procéder de la sorte, c'est utiliser l'ordinateur comme un système physique, ici une roulette qui serait graduée de 0 à 999, avec des cases peintes en couleurs alternées. On obtiendrait encore un résultat semblable en demandant le nombre d'octets (modulo N) qui mesure le volume des fichiers temporaires accumulés dans le cache du navigateur (à condition bien sûr que celui-ci n'ait pas été vidé quelques instants auparavant, et que N ne soit pas trop grand) ... C'est en gros ce qui est fait lors de l'appel de randomize (ou son équivalent).

    C'est évidemment plus rapide et moins fatigant que d'aller sur le palier noter le nombre de litres affichés par le compteur de gaz, ou de se rendre à la plus proche station de carburant pour lire le nombre de centimes sur l'une des pompes (1) ... toutes machines à "fabriquer du hasard", qui répondent honorablement à tous les tests connus, de la même façon que le lancer de dés, le tirage de cartes (2) ou la consultation du bilan mensuel de votre carte bancaire (en centimes d'euros, modulo 1000).

    Cordialement, W.

    (1) procédés un peu rustres, mais diététiquement salutaires pour les accros de la programmation, peu soucieux de la promenade quotidienne.
    (2) le paquet ayant été battu par une personne à l'honnêteté irréprochable, cela va de soi.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  15. #15
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut
    D'ailleurs, il y a aussi des sources d'entropie directement sur certains processeurs, notamment derrière l'instruction RDRAND en x86, en exploitant du bruit thermique pour Intel.

    @wiwaxia : tes techniques génèrent-elles des nombres uniformément répartis ? Pour ton compteur à gaz, tu as une évolution temporelle : si tu connais la valeur précédente, tu peux déjà estimer pas mal sur la prochaine valeur, sauf peut-être sur les dernières décimales, en fonction de tes besoins. Tu risques donc de générer certains nombres plus souvent que d'autres, sans une totale indépendance statistique — pas des propriétés attendues, en général.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  16. #16
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Citation Envoyé par disedorgue Voir le message
    Une autre question (qui a son importance), le nombre positif ci-dessous est-il valide ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123432345654389087656781234586345678456775323344556788909876432212345678908767654332123456754346780865431234556678767986434566656545456789900987654567854578765435789987578096433568974224678098765433457809876547689098778909098094545654567687651
    En Ada tu as un attribut " 'Valid " , qui pemet de le savoir .

    Je met à ta disposition 2 programmes =

    Le code suivant prend ton entrée au clavier . Puis , si ton entrée correspond au type demandé , ici Positif , la valeur booléene de 'Valid = TRUE s'affiche .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    with Ada.Text_IO;   use Ada.Text_IO;
    WITH Ada.Integer_Text_IO ;    USE Ada.Integer_Text_IO ;
     
    Procedure Validation is
     
      ton_nombre : Positive ;
     
     begin
     
     get(ton_nombre);
     
     put("Ton nombre est-il un Positif Valide  ? : " & Boolean'Image(ton_nombre'Valid) ); 
     
     end Validation;

    À suivre ensuite , un code dans lequel j' assigne ta valeur au type Positif .

    Le type Positif est prédéfinit par le compilateur Gnat , conforme aux normes du langage .

    Voici donc la valeur mathématique de Gnat pour le type Positif : https://en.wikibooks.org/wiki/Ada_Pr.../Standard/GNAT



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    with Ada.Text_IO;   use Ada.Text_IO;
     
    Procedure disedorgue is
     
     ton_nombre_positif : Positive ;
     
     begin
     
     ton_nombre_positif := 123432345654389087656781234586345678456775323344556788909876432212345678908767654332123456754346780865431234556678767986434566656545456789900987654567854578765435789987578096433568974224678098765433457809876547689098778909098094545654567687651 ;
     
    end disedorgue;
    À la compilation s' affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    disedorgue.adb:9:24: value not in range of type "Standard.Positive"
    disedorgue.adb:9:24: static expression fails Constraint_Check
    Cela signifie que d'aprés Gnat , ta valeur est trop grande , donc n'est pas de type Positif .

    C'est aussi le cas avec les types Entiers comprenant de plus grandes valeurs :
    Integer , Long_Integer , Long_Long_Integer .

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Tu n'as pas compris ma question, je pense: le nombre que je te donne est un entier positif, après si ton ADA ne le reconnais pas comme tel, c'est un autre souci (qui est la limite du langage que tu emploies).
    Dans ce fil de discussion, on est pas censé prendre en compte les limites d'un quelconque langage...

    Ton besoin semble être limité sur le nombre de chaines de caractères que tu as en stock, et ce que tu sembles vouloir, c'est afficher l'une de ces chaines au hazard.
    Donc si tel est ton besoin, le nombre positif maximal est le nombre de chaines de caractères que tu possèdes (ce qui est loin de représenter la valeurs d'un positif max défini par un quelconque langage).
    Cordialement.

  18. #18
    Membre du Club
    Homme Profil pro
    chômeur
    Inscrit en
    Septembre 2015
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Septembre 2015
    Messages : 175
    Points : 62
    Points
    62
    Par défaut
    J'ai réussi à créer un programme avec la fonction Random .
    Il affiche 1 chiffre , compris entre 1..5 , sur chacune de 2 lignes distinctes .

    J'utilise cette fonction pour des entiers , mais elle décrite dans l'A.R.M comme fonctionnant avec les types discrets en général .

    J'ai découvert ceci :

    -- Note: the implementation used in this package is a version of the
    -- Mersenne Twister. See s-rannum.adb for details and references.
    https://fr.wikipedia.org/wiki/Mersenne_Twister

    Avez-vous déjà utilisé cet algorithme ?

  19. #19
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Générer un positif aléatoirement, ou: du bon usage d'un compteur à gaz
    Bonjour, et bonne année à tous !

    Citation Envoyé par dourouc05 Voir le message
    @wiwaxia : tes techniques génèrent-elles des nombres uniformément répartis ? Pour ton compteur à gaz, tu as une évolution temporelle : si tu connais la valeur précédente, tu peux déjà estimer pas mal sur la prochaine valeur, sauf peut-être sur les dernières décimales, en fonction de tes besoins. Tu risques donc de générer certains nombres plus souvent que d'autres, sans une totale indépendance statistique — pas des propriétés attendues, en général.
    C'est exact, et il m'a fallu ressortir d'anciens relevés pour étayer ma réponse de données réelles.

    Soit un pavillon isolé, dont la chaudière consomme en moyenne 6.4 m3 de gaz par jour en automne, avec une variation de +-25 % en fonction de la température extérieure. Deux relevés consécutifs espacés d'une semaine conduiront donc par différence à un volume de valeur moyenne Vm = 44.8 m3, et d'incertitude absolue Ev1 = 0.25*Vm = 11.2 m3; ajoutons à ceci un éventuel décalage horaire (pour le second relevé) de +-3 heures, susceptible de faire varier le résultat de +-6.4*(3/24) = +-0.8 m3: le résultat final sera donc affecté d'une incertitude totale Ev = Ev1 + Ev2 = 12.0 m3, et le volume affiché situé dans un intervalle de centre (Vm) et de largeur Lv = 2*Ev = 24.0 m3 = 24000 L, soit 24 séquences complètes des 3 décimales <abc> donnant le volume résiduel, en litres.
    On devine que la probabilité de sortie d'un triplet donné (par ex. 827) est alors quasiment fixe, et très proche de 1/1000.

    Je n'ai malheureusement pas de lien sous la main, pour une illustration. Ce n'est cependant pas très compliqué:
    a) Imaginer une fonction continue de densité de probabilité, nulle en-dehors de [V1 = 32.8 m3 ; V2 = 56.8 m3] , et maximale en x = Vm = (V1 + V2)/2 ;
    b) découper l'aire sous-jacente, par définition égale à l'unité, en 24000 (!) tranches verticales de largeur h = 0.001, et correspondant au semi-ouvert
    [Xk = V1 + h*(k-1) ; Xk+1 = Xk + h[ avec k entier naturel situé dans [1 ; 24000];
    c) la probabilité de sortie d'un triplet donné <abc> (par ex. 827) est alors donnée par la somme des aires des 24 tranches correspondantes:
    P(<abc>) = A(32.827) + A(33.827) + A(34.827) + ... + A(55.827) .

    Le fonctionnement de la machine est bien associé à un autre phénomène, non (ou mal) maîtrisé: ici la météo (principalement), et le délai (Dt) séparant les deux repérages.

    L'exemple ci-dessus montre qu'un système physique générateur de hasard se caractérise par un temps mort (Tm) en-dessous duquel la distribution des résultats successifs s'éloigne beaucoup de l'uniformité statistique; si l'on note (Tc = V0/6.4 = 0.156 j = 3.75 h) la période d'un cycle correspondant à l'écoulement d'un volume V0 = 1 m3 = 1000 L, donc au premier retour à <000> des 3 derniers chiffres affichés, le délai (Dt) précédemment évoqué doit ainsi vérifier: ─ Dt >> Tc ,
    ─ et en ce qui concerne l'incertitude associée au résultat: Ev >> V0 , soit encore: Ev*(6.4*Dt/Vm) >> V0 ,
    ce qui donne: Dt >> (V0/6.4)*(Vm/Ev) = 3.73 * Tc = 0.583 j = 14.0 h ,
    et conduit à choisir à l'estime un temps mort Tm ~ 10 * Tc = 37.5 h = 1.56 j .

    L'opportunité d'une telle limite dépend évidemment de la loi de densité de probabilité sur le domaine [V1 ; V2] , loi qu'il faut connaître pour comparer P(<abc>) à la valeur idéale (1/1000) attendue.
    Prenons par exemple la plus simple des fonctions de densité de probabilité, le polynôme du 2nd degré s'anullant aux bornes de l'intervalle [a; b]:
    d(x) = M*(x - a)*(b - x) , avec M = 6/(b - a)3
    et admettant pour primitive: F(x) = M*(-a*b*x + (a+b)*x2/2 - x3/3) , laquelle vérifie F(b) - F(a) = 1 .
    L'aire de la tranche construite sur le domaine [v, v+h[ est alors: A(v, v+h) = F(v+h) - F(v) = h*[d(v) + M*((a+b)/2 - h/3 - v)] ; et l'on obtient en reprenant l'exemple précédent (V1 = 32.8 m3 , V2 = 56.8 m3 , M = 0.006/243 m-3):
    P(<827>) = 0.99854E-3 - soit un écart relatif de 1.46E-3 par rapport à la valeur idéale (1E-3);
    Les valeurs extrêmes ne diffèrent aussi que de 1 à 2 millièmes:
    P(<800>) = 0.99827E-3 , P(<300>) = 1.00087E-3 , et le système envisagé est bien susceptible de fournir (dans les conditions précisées plus haut) une liste de valeurs aléatoires; on ne pourrait observer des écarts significatifs qu'au delà de plusieurs dizaines de milliers de termes (soit au minimum 43 ans ...).

    Le recours à l'horloge interne égrainant les millisecondes, avec une période de cycle (Tc) ramenée à une seconde, apparaît sous cet aspect incomparablement plus souple que le compteur à gaz (ce n'est sûrement pas un scoop ! ), et il est intéressant d'observer l'évolution des probabilités en fonction de l'étalement des valeurs enregistrées.
    La dispersion des résultats découle ici de la variabilité (inconnue, mais seulement encadrée) de l'intervalle de temps (Dt) séparant deux frappes consécutives de la touche déclenchant l'enregistrement de l'heure.
    La valeur obtenue est ici le temps quotidien affiché par l'horloge, à priori situé dans l'intervalle: [V1 = N1*Tc , V2 = V1 + N*Tc], ce qui implique: Vm = (N1 + N/2) * Tc et Lv = N * Tc ; le recours aux entiers positifs (N, N1) permet d'éliminer les discontinuités, donc des complications inutiles. Par ailleurs, la séquence des décimales étant conservée par décalage du temps d'un nombre entier de secondes, on peut imposer au graphe de densité une translation horizontale conduisant à une équation plus simple; on posera ainsi:
    a = V1 - N1*Tc = 0 ; b = [V2 - N1*Tc = N * Tc = Lv , pour obtenir l'expression numérique de la probabilité:
    A(x, x+h) = M*(x*(N - x) + h(p - x)) , avec h = 1E-3 , M = (6*h) / N3 , p = (N/2) - (h/3) et 0 <= x < N*Tc .
    Les résultats obtenus confirment ce qui a été indiqué plus haut (il y a une symétrie par rapport à la médiane 499.5 qui dispense de la moitié des calculs); ils se rapprochent d'autant plus de la vapeur idéale (1/1000) que le nombre (N) de cycles contenus dans l'intervalle est plus élevé; au-delà de N = 10 , les écarts observés deviennent inférieurs à 1 % (ils apparaissent d'ailleurs proportionnels à (1/N2)):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Valeurs de 1000*P(<abc>)
     
    <abc>            000          250          499
     
    N = 1          0.002998     1.126498     1.449998
     
        3          0.889222     1.014055     1.055555
     
       10          0.990030     1.001265     1.005000
     
       32          0.999026     1.000124     1.000488               
     
      100          0.999900     1.000013     1.000050
    Il résulte de ce qui précède que des appels manuels successifs de l'horloge interne fournissent des résultats aléatoires, s'ils sont espacés d'au moins une minute et indépendants de tout affichage externe du temps: l'exécutant ne doit pas percevoir un signal sonore ou lumineux énumérant les secondes !


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  20. #20
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    wiwaxia, tu expliques pourquoi la technique du 'compteur à gaz' convient. Et ton explication est superbe.

    Mais en plus court, il y avait juste un quiproquo entre toi et Dourouc05.
    La technique du compteur à gaz marche, parce qu'on ne prend que les chiffres 'non significatifs' (c.a.d par exemple les 3 chiffres les plus à droite du compteur, sur un compteur où on a 7 ou 8 chiffres significatifs).
    Et c'est tout simplement ce point là que Dourouc05 n'avait pas relevé dans ton précédent message.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer une chaine aléatoire
    Par java_fun dans le forum Général Java
    Réponses: 24
    Dernier message: 07/11/2018, 23h03
  2. Réponses: 16
    Dernier message: 08/03/2006, 11h18
  3. Besoin de générer une chaine aléatoire
    Par warsky dans le forum Langage
    Réponses: 7
    Dernier message: 01/12/2005, 19h34
  4. générer un nombre aléatoire gaussien
    Par kayari dans le forum Probabilités
    Réponses: 9
    Dernier message: 24/05/2005, 23h57
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo