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

    Numeri casuali in C++ senza Rand?

    Buongiorno a tutti, cercavo un metodo per creare numeri casuali senza l'utilizzo di rand(), credo che non esista, ma se per caso conoscete un modo, ditemelo. Grazie in anticipo.
    Ultima modifica di pierobonluca01; 07-04-2016 a 18:27

  2. #2
    Quote Originariamente inviata da pierobonluca01 Visualizza il messaggio
    Buongiorno a tutti, cercavo un metodo per creare numeri casuali senza l'utilizzo di rand(), credo che non esista, ma se per caso conoscete un modo, ditemelo. Grazie in anticipo.
    Quel "credo che non esista" mi sembra che sia del tutto sbagliato, perché se è possibile realizzarlo tramite una funzione si può realizzare anche tramite un algoritmo scritto da sé.
    Se non sbaglio è una procedura un po' particolare che utilizza l'orologio interno del computer (avendo un output variabile nel tempo) per dare in uscita un numero che varia al variare nel tempo, in modo che ogni istante crei un valore sempre diverso.

    Ora non posso dirti più di tanto, perciò ti consiglio di leggerti questo: https://it.wikipedia.org/wiki/Numeri_pseudo-casuali
    Oppure prova con un pdf: http://www.dia.uniroma3.it/~adacher/...ioneRandom.pdf

    P.S: la generazione di un numero casuale non è una cosa poi così semplice

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Ci sono svariati metodi che sfruttano principi algebrici, per cui in realtà la sequenza di numeri a partire da uno stesso numero è deterministica. E' per questo che spesso si utilizzano dati esterni per "sporcare", come orario corrente, posizione del mouse, ...

    Il metodo più semplice è questo
    codice:
    int mod = qualcosa_di_grande; //possibilmente con determinate caratteristiche per offrire una distribuzione migliore
    int seed = ...;
    int mul = ...;
    int inc = ...;
    int rand() {
      seed = (mul*seed+inc)%mod;
      return seed;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    rand() in genere è semplicemente un LCG (l'algoritmo sopra descritto da scara95), in cui il seed (ovvero, il numero di partenza con cui viene inizializzato l'algoritmo) viene impostato tramite srand (in genere a partire dall'ora corrente o da altri dati sempre diversi ad ogni avvio del programma).

    Giusto per rendere l'idea, lo stesso standard C fornisce un'implementazione di esempio, che come si vede è semplicissima:
    codice:
    static unsigned long int next = 1;
    int rand(void)        // RAND_MAX assumed to be 32767
    {
        next = next * 1103515245 + 12345;
        return (unsigned int)(next/65536) % 32768;
    }
    
    void srand(unsigned int seed)
    {
        next = seed;
    }
    Nota comunque che esiste di molto meglio, sia in termini di generatori di numeri pseudo-casuali (ad esempio, il Mersenne Twister è uno dei generatori "di alta qualità" più diffusi) che di sorgenti di entropia (sotto Linux ad esempio /dev/random fornisce piccole quantità di byte casuali ottenuti da varie sorgenti di entropia da usare come seed per PRNG).
    Ultima modifica di MItaly; 09-04-2016 a 01:36
    Amaro C++, il gusto pieno dell'undefined behavior.

Tag per questa discussione

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.