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

    linguaggio c consigli su rand()

    Sapreste dirmi che differenza c'è tra rand() %100 e rand()*100/RAND_MAX,
    sul mio libro sul linguaggio c della rand non ne parla come se fosse un argomento a parte voi mi sapreste aiutare?

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    rand() %100 -> da un numero da 0 a 99 {il % è il modulo cioè il resto della divisione}

    rand()*100/RAND_MAX -> dipende da cos'è RAND_MAX

  3. #3
    Ci sarebbero molte considerazioni da fare sulla funzione rand(), se vuoi approfondire il discorso leggi Misconceptions about rand.
    "Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: linguaggio c consigli su rand()

    Originariamente inviato da silver81
    rand() %100 e rand()*100/RAND_MAX
    Ti daranno sempre lo stesso range di numeri pseudocasuali da 0 a 99.

    Innanzitutto:

    RAND_MAX è una costante che vale 32767 (se provi a stamparla lo puoi verificare) e corrisponde al massimo intero che può generare la funzione rand(). Mi pare sia definita in stdlib ma controlla perché non ne sono sicuro.


    Per quanto riguarda la tua domanda, quella che sto per darti è più una spiegazione di statistica che altro, e comunque io non ho MAI studiato statistica, quindi mi esprimo in maniera elementare e per esempi, parole tecniche non ne conosco.

    Sia rand() %100 che rand()*100/RAND_MAX ti daranno uno stesso range di numeri pseudocasuali, per la precisione tra 0 e 99; questo perché

    rand()%100: la rand genera un numero qualsiasi tra 0 e 32767 ma di questo numero viene considerato il resto della divisione intera per 100, quindi qualsiasi numero generi (3000, 32000) con l'operatore modulo si riconduce ad uno del range 0-99 (per esempio 31670%100 = 70, nonostante 31670 sia ben più grande di 99).

    rand()*100/RAND_MAX: anche stavolta il range è lo stesso: 0-99 (stavolta può uscire fuori anche 100 ma solo se rand()=32767, che essendo un caso su appunto 32767 è trascurabile). Qualsiasi numero generi la rand viene moltiplicato prima per 100 e poi diviso per 32767; se fai delle prove ti renderai conto facilmente che più di 99 (e cento in un solo caso) non puoi ottenere.

    A questo punto qual è la differenza tra le due operazioni? E' un fatto di distribuzione dei numeri:

    Se provi la prima (rand()%100) ti renderai conto che la distribuzione di numeri che ti danno 0, 1, 2, 3 ecc... è omogenea, questo perché ci sono delle classi di congruenza. Mi spiego:

    per ottenere 0 con questa operazione, la rand dovrebbe generare questi numeri: 0, 100, 200, 300, 400, 500, 600 ecc... fino ad un massimo di 32700. Il resto della divisione intera per 0 di questi numeri, infatti, è appunto 0.

    per ottenere 1 invece la classe di congruenza è 1, 101, 201, 301, 401... ecc...

    Come vedi, quindi, gli elementi della classe di congruenza sono equamente distribuiti in tutto il range dei numeri possibili da 0 a 32767.

    Cosa del tutto diversa è per rand()*100/RAND_MAX

    Per ottenere 0, infatti, i numeri prodotti dalla rand devono andare da 0 a 327 (per tutti questi numeri, infatti, il resto dell'operazione sarebbe sempre 0, tenendo presente il concetto di divisione intera)

    Per ottenere 1, invece, i numeri prodotti dalla rand devono essere compresi tra 328 e 328+327, ossia 655; ancora una volta per tutti questi numeri il risultato del calcolo sarebbe 1, non di meno e non di più.

    E così via... 2 -> 656 - 983; 3 -> 984 - 1310 ecc...

    Noterai quindi che stavolta la distribuzione dei numeri per ottenere 0, 1, 2 ecc... non è più omogenea in tutto il range 0-32767 ma va a intervalli regolari di 327 numeri.

    E' solo una differenza statistica, tutto qui.

  5. #5
    io ho avuto una "strana" esperienza con rand(), che non mi spiego e vorrei comprendere.
    Ho del codice c che richiede l'uso di numeri casuali, basato sull'uso della funzione rand, che viene richiamato da java tramite JNI.
    Se eseguo il codice da solo, ovvero non richiamandolo da Java, RAND_MAX vale (ho verificato sia nella libreria sia stampando su consolle il valore) 0x7FFFFFFF (2147483647) e i numeri generati da rand() effettivamente variano da 0 a 2147483647.
    Se eseguo il codice richiamandolo da Java tramite JNI RAND_MAX continua a valere 2147483647 (ne ho fatto stampare il valore con la printf) ma rand() genera valori da 0 a 32767.
    Sapreste darmi una spiegazione?

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,464

    Moderazione

    Originariamente inviato da Epris
    io ho avuto una "strana" esperienza con rand(), che non mi spiego e vorrei comprendere.
    Ho del codice c che richiede l'uso di numeri casuali, basato sull'uso della funzione rand, che viene richiamato da java tramite JNI.[...]
    Non risollevare discussioni vecchie e ferme da tempo, soprattutto per parlare di un problema che stai già affrontando in un'altra discussione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.