Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Generazione numeri random con lrand48()

    Carissimi tutti,
    quanto sto per dire credo che sia già stato un quesito sollevato ma purtroppo non ho trovato le risposte al mio dubbio per cui perdonatemi se inserisco il post con nuovi quesiti.
    Nella generazione di numeri casuali (intervalli inclusi e non) trovo i seguenti stralci di codice:

    [X,Y] (intervalli inclusi)
    double casuale= X + (X-Y)*lrand48()/RAND_MAX

    [X,Y) (aperto a dx)
    double casuale=X + (lrand48()/(RAND_MAX+1.))*(X-Y)

    (X,Y] (aperto a sx)
    double casuale=X + ((lrand48()+1.)/(RAND_MAX+1.))*(X-Y)

    (X,Y) (aperto a sx e dx)
    double casuale=X + ((lrand48()+1.)/(RAND_MAX+2.))*(X-Y)

    Fatto salvo l'inizializzazione del seme, mi chiedo il motivo dei "+1. e 2." e perchè questa "versione" è preferibile a quella che sfrutta il resto della divisione.
    Ho trovato svariate spiegazioni,frammentarie ma nulla di organico e chiaro.
    Soprattutto mi è ignoto lo shift utilizzato al denominatore nella versione in cui si escludono entrambi gli estremi.
    Certo del vostro prezioso aiuto vi ringrazio in anticipo
    Alessandro
    Gandalf il Bianco

  2. #2
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Sono un po' confuso.
    La domanda è " qual'è un buon generatore random " o magari "quali sono i test empirici per testarli) ?

  3. #3
    Ciao e grazie per la risposta.
    Direi che per quanto concerne il mio apprendimento avrei due ostacoli al momento.
    Il primo riguarda gli "addendi" che permettono di escludere gli estremi dall'intervallo che si considera. Non riesco ad afferrarne il ragionamento che vi è dietro le quinte.
    Il secondo è che non comprendo il motivo perchè nei vari gruppi a tema "random numbers" qualcuno non nomina per nulla il sistema sopra esposto e vira direttamente al discorso dei resti.Questi sono i due dilemmi...
    Alessandro
    Gandalf il Bianco

  4. #4
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    1) per gli estremi la funzione è aperta a destra, cioè ritorna <2^31, mentre non lo è a sinistra (può tornare 0).
    Quando torna 0 ovviamente chiude a destra, qualsiasi cosa ci metti.
    Puoi vedere come funzionano gli addendini ricordando come cos'è RAND_MAX, cioè il massimo che viene ritornato
    Se supponi di avere una funzione random più semplice, cioè tra 0 e 2^2, avrai 4 possibili risultati
    0,1,2,3 (4 no perchè è aperto a destra).
    Ora supponiamo di esaminare coi parametri
    X=4
    Y=10

    (X,Y] (aperto a sx)
    double casuale=X + ((lrand48()+1.)/(RAND_MAX+1.))*(X-Y)

    (0+1)/(3+1) = 1/4
    (1+1)/(3+1) = 2/4
    (2+1)/(3+1) = 3/4
    (3+1)/(3+1) = 4/4
    Quindi i valori (salvo errori) saranno

    4+ 1/4 * (6) = 5.5
    4+ 2/4 * (6) = 7
    4+ 3/4 * (6) = 8.5
    4+ 4/4 * (6) = 10
    cioè aperto a sinistra, chiuso a destra

    [X,Y) (aperto a dx).
    Togliendo il "+1" si prende il caso 0 (e quindi chiude a sinistra)
    double casuale=X + (lrand48()/(RAND_MAX+1.))*(X-Y)
    (0)/(3+1) = 0
    (1)/(3+1) = 1/4
    (2)/(3+1) = 2/4
    (3)/(3+1) = 3/4

    4+ 0 * (6) = 0
    4+ 1/4 * (6) = 5.5
    4+ 2/4 * (6) = 7
    4+ 3/4 * (6) = 8.5
    ed è chiuso a sinistra, ma aperto a destra



    Ti lascio per esercizio gli altri due casi, essenzialmente il "+1" e "+2" fanno "scorrere" la lista dei numeri, eliminando lo zero (+1) e l'estremo superiore (+2)

    Detto questo: la "vera" domanda è
    qual'è un buon generatore? la risposta è "non si sa di preciso", si adottano test più o meno empirici per saggiarne la qualità.
    Riguardo all'ultimo punto ovviamente non sapendo esattamente come è implementata la funzione non ci si può fidare più di tanto.
    Ultima modifica di MySQL; 21-07-2015 a 18:26

  5. #5
    Innanzitutto grazie davvero per la preziosa risposta.
    lrand48() non restituisce un numero random tra [0,RAND_MAX] (con RAND_MAX che dipende dal compilatore utilizzato?) estremi inclusi?
    Oppure quando dici "la funzione è aperta a destra" ti riferisci a ciò che viene implementato all'interno di lrand48()?
    e poi il 48 per cosa sta quando il C Ansi usa la "random()"?
    Un saluto e grazie ancora
    Alessandro
    Gandalf il Bianco

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.