Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C] Come funziona il Random ? (nei particolari)

    Come si fa' a costruire una funzione random ? o
    Come e' costruita la funzione random ?

  2. #2
    Utente di HTML.it L'avatar di pdpmpd
    Registrato dal
    Jan 2003
    Messaggi
    448
    per i numeri quasi-casuali c'è la funzione standard "rand", facente parte della standard library, che ritorna un intero compreso tra 0 e RAND_MAX.
    RAND_MAX è difinito nell'header stdlib.h

    la sequenza di numeri ritornata da rand è legata al seme random, che tu imposti con la funzione

    srand(<intero>);

    Ogni volta che imposti lo stesso seme random la sequenza di numeri generati sarà la stessa (se non imosti il seme, di default è 1).
    di solito, per impostare un seme diverso in diverse esecuzioni dello stesso programma, si usa passare a srand l'ora di sistema.
    A differenza di altri linguaggi di programmazione (tipo il pascal) la funzione random C non prende nessun argomento (niente valori massimi nè minimi, nè intervalli) quindi, per ottenere un numero casuale all'interno di un intervallo da te definito devi effettuare dei calcoli sul numero generato.
    il modo di fare questo calcolo più usato è questo:

    se vuoi generare un numero compreso tra 1 e 10
    int a=1+(int)(10.0*rand()/(RAND_MAX+1.0));


    altro modo di generare numeri random è la funzione "random", sempre inclusa nell'stdlib, che dovrebbe usare un'altro algoritmo.
    A quanto mi è parso di capire questa seconda funzione è più complessa, ma in Linux usa lo stesso algoritmo di rand ( ), sembra che usi un algoritmo non-standard su piattaforme sun.
    Drug misuse is not a disease, it is a decision, like the decision to step out in front of a moving car. [...] In this particular life-style the motto is "be happy now because tomorrow you are dying", but the dying begins almost at once, and the happiness is a memory.

  3. #3
    Ma ad ogni riavvio crea sempre la stessa serie di numeri !

    Non c'e' qualcosa di meglio ?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Purtroppo i computer sono delle macchine, non hanno il concetto di casualità: nulla nelle macchine è lasciato al caso... il caso viene generato attraverso la simulazione di un generatore casuale che fa uso di una funzione statistica per generare numeri pseudo-casuali.

    Se ti interessa ho l'algoritmo di un generatore prodotto da un professore di statistica che, secondo lui (perchè io di statistica me ne intendo poco, non è il mio campo :gren: ), è migliore di quello usato nelle librerie atandard dei vari linguaggi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di pdpmpd
    Registrato dal
    Jan 2003
    Messaggi
    448
    hai usato il timer per impostare il seme random diverso a ogni avvio?
    Drug misuse is not a disease, it is a decision, like the decision to step out in front of a moving car. [...] In this particular life-style the motto is "be happy now because tomorrow you are dying", but the dying begins almost at once, and the happiness is a memory.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2001
    Messaggi
    167
    Originariamente inviato da nightfall
    Ma ad ogni riavvio crea sempre la stessa serie di numeri !

    Non c'e' qualcosa di meglio ?
    inserisci prima della funzione questa linea di codice:

    srand((unsigned)time(NULL));

    e la sequenza non sarà sempre la stessa.

  7. #7
    ...Terrible warlords, good warlords, and an english song

  8. #8
    Utente bannato
    Registrato dal
    Jan 2003
    Messaggi
    1,414
    Fai così

    codice:
    srand(time(NULL));
    xxx = rand() % NN +1;
    Dove

    xxx = nome variabile
    NN = sostituiscilo con i numeri compresi; ad es per far sì che scelga un numero a caso fra 1 e 1000, metti 1000 al posto di NN

    +1 ti serve perchè altrimenti conterebbe da 0 e i valori verrebbero sfalsati: cioè se tu mettessi %6 non ti uscirebbero

    1 2 3 4 5 6

    ma bensì

    0 1 2 3 4 5

    Ah, come già detto i computer non possono calcolare un numero a caso dal nulla, però questo modo ci va vicino perchè funziona con l'orologio del sistema...è il metodo migliore che conosco, fammi sapere


  9. #9
    Ok la fuzione rand() funziona ma
    nello stesso secondo da valori uguali !

  10. #10
    Utente bannato
    Registrato dal
    Jan 2003
    Messaggi
    1,414
    Originariamente inviato da nightfall
    Ok la fuzione rand() funziona ma
    nello stesso secondo da valori uguali !
    Te l'ho detto, è basato sull'orologio di sistema quindi se li apri proprio nello stesso secondo probabilmente te li dà uguali...ma hai bisogno di così tanta casualità? Non ti basta aspettare 1 secondo?

    che io sappia questo è il metodo migliore... :quipy:

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 © 2024 vBulletin Solutions, Inc. All rights reserved.