Come posso in C++ generare un numero DAVVERO casuale? o almeno il più random possibile!!?

6 risposte

Classificazione
  • 1 decennio fa
    Risposta preferita

    la "casualità" di una sequenza di numeri è "misurata" studiandone la statistica della distribuzione. I numeri pseudocasuali generati da funzioni come rand() sono, dal punti di vista della statistica "comune", buoni numeri casuali: gli algoritmi sono studiati apposta affinché una analisi statistica sulla sequenza generata non riveli che si tratta di numeri generati da un programma.

    la sequenza, a partire da un dato seme, è comunque sempre la stessa (questa è una caratteristica importante: in molte applicazioni dove sono necessari numeri casuali, è importante anche poter riprodurre una determinata sequenza casuale... il fatto che a partire da un certo seme si abbia, a parità di algoritmo, la stessa sequenza *non* vuol dire che i numeri non sembrino, sempre da un punto di vista statistico, casuali)

    se vuoi cambiare ogni volta la sequenza, puoi impostare ogni volta il seme usando una funzione che restituisce il tempo (time() va bene).

    inoltre ricorda che se usi rand() ( #include <cstdlib> perché è una funzione della lib standard del C) e vuoi un numero limitato numericamente, *non* devi usare il modulo; cioè se vuoi un numero tra 0 e N-1, non devi usare rand() % N: in questo modo "rovini" la statistica del generatore e una analisi della sequenza rivelerebbe che si tratta di numeri generati pseudocasualmente (un algoritmo è tanto migliore quanto riesce a nascondere, ad una analisi della sequenza, questo fatto... inoltre alcuni algoritmi hanno un periodo, cioè se generi sequenze lunghissime, finisce che una analisi sia in grado di dire con certezza che si tratta di numeri generati)

    se hai bisogno di statistiche particolari, ovviamente ci sono librerie con diversi tipi di generatori con statistiche particolari, per esempio nella GNU Scientific Library c'è un bell'assortimento di vari generatori random

    http://www.gnu.org/software/gsl/

    l'uso di uno invece dell'altro dipende dal tipo di "evento casuale" che vuoi "riprodurre" artificialmente; il che ti fa anche capire che "numeri *davvero* casuali" è un modo di dire perché dal punto di vista dell'uso, l'importante è che le sequenze generate rispettino la statistica attesa per quel tipo di "casualità" (p.es. il lancio di dadi rispetta la binomiale, la variabile casuale è uniforme discreta... vuol dire per semplificare che se il dado non è truccato tutti i numeri sono equiprobabili e dunque si distribuiscono "uniformemente", mentre "discreta" perché i numeri sono 1, 2, 3, 4, 5 o 6, cioè numeri discreti; processi di misura rispettano una distribuzione gaussiana, cioè diciamo una "campana" intorno a un valore, che è il valore atteso ovvero in effetti la "misura" cercata... e così via).

    a partire da un generatore come quello fornito da rand() (tutti i numeri da 0 a RAND_MAX sono equiprobabili) è possibile costruire "altre statistiche", per così dire... ma in generale per usi particolari è meglio usare una libreria come appunto la GSL.

    vale la pena infine leggere

    http://www.gnu.org/software/gsl/manual/html_node/U...

    dove osserva che «Note that these generators [rand() e company] don't produce high-quality randomness and aren't suitable for work requiring accurate statistics» ... ma per usi comuni (come voler simulare le estrazioni del lotto o il lancio di dadi...) vanno benissimo...

    e

    http://www.gnu.org/software/gsl/manual/html_node/G...

    «A good random number generator will satisfy both theoretical and statistical properties», ed è questo, e solo questo che determina se la "casualità" è buona o no, non la sensazione o valutazioni del tipo "questa sequenza è il più random possibile" ...!

    e naturalmente tutto il discorso va anche corredato con questo link

    http://www.gnu.org/software/gsl/manual/html_node/R...

    che lo completa

  • 1 decennio fa

    ce gia la funzione random in c++...una macchina non puo sparare un numero a caso se lo deve sempre partire da un numero(solitamente ora e minuti) percui il numero diventa sempre retrocalcoabile..non esistono numeri piu casuali di altri

    rand()

  • 4 anni fa

    Democrazia non è fare un referendum in keeping with decidere su qualsiasi tema, tipo theory di casaleggio-grillo, questo è caos. Democrazia è la capacità di un paese di saper creare delle regole condivise chiare che permettono a tutti la partecipazione alla vita pubblica, con un sistema ovviio capace di bilanciare e separare i poteri.

  • 1 decennio fa

    Vero tutto quello che leggo ma...

    Mi sono trovato un po' di tempo fa a dover risolvere una situazione del genere per una particolare applicazione che richiedeva la certezza di una sequenza numerica casuale.

    Le funzioni messe a disposizioni dai diversi linguaggi non hanno la possibilità di garantire delle sequenze numeriche veramente casuali.

    Dopo una lunga ricerca tra generatori con soluzioni a dir poco incredibili. quali la generazione di numeri casuali dal umore stellare di fondo, ho trovato quello che cercavo.

    http://www.idquantique.com/products/quantis.htm

    Naturalmente bisogna aggiungere un piccolo hardware al pc. Se invece la tua applicazione richiede una sequenza con garanzia "discreta" di casualità puoi utilizzare un servizio tipo questo:

    http://www.random.org/

  • Che ne pensi delle risposte? Puoi accedere per votare la risposta.
  • 1 decennio fa

    qui http://www.agner.org/random/ trovi liberie che producono varie distribuzioni di probabilità tra cui l'uniforme (il vero random)

  • 1 decennio fa

    non è possibile !

Altre domande? Fai una domanda e ottieni le risposte che cerchi.