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

Probabilités Discussion :

Random avec paramètre


Sujet :

Probabilités

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut Random avec paramètre
    Bonsoir,
    Désolé si le titre n'est pas claire, j'ai du mal à mettre un nom sur ce que je cherche à faire
    J'essaie de créer une fonction qui prend en paramètre une clef et un index maximum.

    Le but du jeu est que

    • La fonction retourne un nombre entre 1 et index_maximum.
    • Si la fonction est appelée deux fois avec la même clef, le retour soit identique.
    • Que la dispersion soit bonne. (si j'ai 1 000 000 de clef différente et que j'ai un index_maximum à 5, j'aimerai qu'il y ai approximativement autant de 1 que de 2 que de 3 que de 4 et que de 5).

    J'ai eu beau faire quelque essais mais soit je n'arrive pas a avoir une bonne dispersion, soit je n'arrive pas à retourner deux fois la même chose pour une clef identique.
    Je fais donc appels à vous

  2. #2
    Membre très actif
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Billets dans le blog
    1
    Par défaut
    pour generer de l'aleatoire, il existe plein de methodes.

    bientot, la generation de nombres aleatoires sera directement supportée par les CPU intel avec l'instruction RDRAND.

    en attendant, il existe des tonnes d'algorithmes ayant plus ou moins d'instructions elementaires.
    il faut essayer diverses combinaisons d'instructions logiques et arithmetiques de base, et observer le resultat avec divers programmes de test.

    le but est, en partant d'une graine G, de toujours obtenir la meme sequence S{...}.
    et si on va plus loin en faisant un XOR de la sequence avec un fichier, ça ressemble à de la cryptographie.

    je ne sais pas quel langage utiliser pour ça en dehors de l'assembleur, surtout s'il faut aller vite.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Citation Envoyé par edfed Voir le message
    et si on va plus loin en faisant un XOR de la sequence avec un fichier, ça ressemble à de la cryptographie.
    Oui c'est tout à fait normal. Tous les algorithmes modernes de cryptographie sont d'excellent générateur de nombre pseudo-aléatoire, puisque si l'on parviens à trouver un biais statistique au niveau de leur sortie, cela indique une faiblesse exploitable pour l'attaquer.

    Sinon Java à la base utilise la fonction suivante pour générer des nombres pseudo aléatoires, s étant le seed.

    sqrt(-2 * log(s) / s);

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Je ressors un vieux code déjà posté ici :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* return a pseudo-random number between 0 and 1 */
    public static double rnd(int x) {
    	x = (x<<13)^x;
    	return ((x*(x*x*15731+789221)+1376312589) & 0x7fffffff) / 2147483648.0;
    }

    Manque une petite transformation pour avoir un entier entre 1 et N, et le tour est joué.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* return a pseudo-random integer between 1 and N */
    public static int rnd(int x, int N) {
    	x = (x<<13)^x;
    	return 1 + ((x*(x*x*15731+789221)+1376312589) & 0x7fffffff) % N;
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    Merci pour les réponses rapides.
    Ma clef n'est pas du tout numérique (c'est un hash type MD5).
    Niveau performance il faut que ça reste correcte (c'est dans un langage interprété, tout est relatif) car cette fonction sera appelée à répétition.

    En gros, je dispose de plusieurs serveur, contenant chacun une bases de donnée, composée elles même de plusieurs tables (au schéma identique).

    Chaque donnée est identifiée par une clef,
    Lorsque je veux ajouter une information, je créer la clef, je la passe dans la fonction dont je vous parle, et ça me sors un premier nombre entre 1 et x (suivant le nombre de serveur), puis je vais réutiliser la fonction pour choisir une table (entre 1 et y).
    Lorsque je veux lire une information, je possède sa clef, je la passe dans la fonction dont je vous parle et ça me retourne le bon serveur et la bonne table.

    Voilà ce que j'essaye de faire en fait.

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par sloshy Voir le message
    Merci pour les réponses rapides.
    Ma clef n'est pas du tout numérique (c'est un hash type MD5).
    Un hash MD5 est une valeur numérique (sur 128 bits).

    La fonction random que j'ai donné prend en paramètre une valeur sur 32 bits.
    En découpant le hash MD5 en 4*32bits, on peut appeler 4 fois la fonction random, en cascadant les résultats/paramètres (par exemple un XOR).

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* return a pseudo-random positive integer */
    public static int rnd_int32p(int x) {
    	x = (x<<13)^x;
    	return ((x*(x*x*15731+789221)+1376312589) & 0x7fffffff);
    }
     
    // 4 calls
    int rnd = 0;
    rnd = rnd_int32p(rnd ^ md5_bits1_32);
    rnd = rnd_int32p(rnd ^ md5_bits33_64);
    rnd = rnd_int32p(rnd ^ md5_bits65_96);
    rnd = rnd_int32p(rnd ^ md5_bits97_128);
     
    // rescale in 1...N
    rnd = 1 + (rnd % N);
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre émérite Avatar de sloshy
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2005
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 728
    Par défaut
    Merci j'ai compris l'idée (oui bon le code est à retoucher mais l'idée est compris)

  8. #8
    Membre très actif
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Billets dans le blog
    1
    Par défaut
    sympa la solution C, mais il y a 3 multiplications, au moins une division, et un pourcentage en cas de mise à l'echelle, ça mange du CPU tout ça.
    voici une fonction random sans multiplication, ni division, ni autre operation math trop gourmande.
    elle prend en seed une clé de longueur variable, et la taille de la clé est utilisée dans le calcul du nombre aleatoire 32 bits.
    le but etait de chiffrer un fichier à partir d'une clé de longueur variable, testé avec des clés de 32000 bits sans perte notable de vitesse. après, c'est très lent.
    Code asm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    .rnd:
    ;edx = seed(size,[key])
    ;return eax = rnd
            push ebx ecx
            xor eax,eax
            mov ecx,[edx]
            shr ecx,2
            dec ecx
            jl .not
            push ecx
            stc
            xor ebx,ebx
    @@:
            sbb eax,[edx+ecx*4]
            xor eax,ecx
            lea ebx,[eax*4+ecx+127]
            loop @b
            xor eax,ecx
            stc
            pop ecx
    @@:
            adc [edx+ecx*4],eax
            adc eax,[edx+ecx*4]
            adc ebx,eax
            xor eax,ebx
            ror eax,cl
            loop @b
    .not:
            pop ecx ebx
            ret
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    je serais curieux de savoir comment on pourrait traduire ce code en C ou en pseudo code.
    ça permettrais de partager le meme systeme de chiffrement avec d'autres programmes, dans d'autres langages.

    pour generer un nombre entre X et Y, on peu faire un pourcentage, mais aussi un modulo.
    le pourcentage demande une multiplication et une division, alors que le modulo ne demande qu'une division. sur un nombre aleatoire, le modulo est aussi aléatoire que le pourcentage.

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

Discussions similaires

  1. dbexpress : delete avec paramètre
    Par KRis dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/06/2005, 10h04
  2. [VB.net] Thread avec paramètres
    Par WriteLN dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/04/2005, 17h42
  3. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33
  4. [PL/SQL] Curseur avec Paramètre
    Par blids dans le forum Oracle
    Réponses: 5
    Dernier message: 10/10/2004, 20h07
  5. Réponses: 3
    Dernier message: 21/05/2003, 11h44

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