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

    [C] Funzione Random

    E' possibile utilizzare la funzione random inserendo dei valori più probabili di altri? A me serve una funzione che assegni al vettore valori 1 e 0; come faccio a dire di assegnare a questi un numero maggiore di 0 rispetto agli 1?

  2. #2
    Fermo restando che si parla di numeri pseudocasuali, non esiste un metodo standard per fare ciò che chiedi ma puoi crearti una tua *logica*: supponiamo per esempio che il numero 0 debba uscire 4 volte su 5, cerchi un numero random da 1 a 5 e, in caso di uscita di 1,2,3,4 consideri l'uscita di 0, altrimenti di 1.
    Questo non significa necessariamente che, su n uscite, 4/5 siano rappresentate da 0 e 1/5 da 1 ma è comunque un buon punto da cui partire.


    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    [/quote]A me serve una funzione che assegni al vettore valori 1 e 0[/quote]
    Per generare solo 0 o 1
    codice:
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
       srand(time(NULL));
       
       int i;
       
       for(i = 0; i < 100; i++)
          printf("%d\n", rand() % 2);
       
       return 0;
    }
    vedi grassetto. In questo caso % 2 vuol dire che genera numeri casuali in un rango compreso da 0 a 1.
    Per maggiori chiarimenti vedi qui.
    come faccio a dire di assegnare a questi un numero maggiore di 0 rispetto agli 1
    Devi implementare una funzione..

  4. #4
    Stabilisci che percentuale di 0 e di 1 vuoi. Diciamo che vuoi il 40% di zeri e (di conseguenza) il 60% di uni.
    Dato che la rand() restituisce una distribuzione teoricamente omogenea di valori tra 0 e MAX_RAND, ti basterà considerare il risultato dell'estrazione come 0 se rand() ti restituisce un valore compreso tra 0 e MAX_RAND/10*4 e 1 altrimenti.
    Oppure, per maggiore chiarezza, puoi fare
    codice:
    double r=rand()/(double)MAX_RAND;
    ottenendo così un numero compreso tra 0 e 1; se esso è minore di 0.4, allora consideri uno 0, altrimenti un 1.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Per esempio se vuoi avere piu' probabilita' di avere un 1 fai:
    codice:
    x=rand()%2*rand()%2*rand%2;
    In questo caso c'è il 1/8 di posibilità che esca 1.
    Oppure se vuoi piu' 0 fai:
    codice:
    x=rand()%2+rand()%2+rand%2;
    if(x>=1)
      x=1;
    Poi ci sarebbero altre mille varianti.

  6. #6
    Grazie mille a tutti per avermi fatto capire il meccanismo... penso che seguirò quello che ha detto MdE2005...

  7. #7
    Consiglio: per ottenere un numero compreso tra 1 e 5 non usare il metodo dell'operatore modulo, otterresti numeri non troppo casuali (le cifre più basse dei numeri forniti da rand() sono le meno casuali). Dai una letta a questa mia risposta per avere una panoramica dell'uso corretto di rand().
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Originariamente inviato da MItaly
    Consiglio: per ottenere un numero compreso tra 1 e 5 non usare il metodo dell'operatore modulo, otterresti numeri non troppo casuali (le cifre più basse dei numeri forniti da rand() sono le meno casuali). Dai una letta a questa mia risposta per avere una panoramica dell'uso corretto di rand().
    Sicuramente, l'algoritmo da utilizzare è proprio quello:
    codice:
    int GetRandomInt(int Min, int Max) 
    { 
        return (rand()%(Max-Min+1))+Min; 
    } 
    //e ovviamente si usa così:
    int main (){
    int ret;
    ret = GetRandomInt(1,5)
    if (ret<=4)//...
    else //....
    }

    Ciao

  9. #9
    Originariamente inviato da MdE2005
    Sicuramente, l'algoritmo da utilizzare è proprio quello:
    Ho scritto precisamente di non usarlo se servono dati piuttosto random, perché l'operatore modulo tiene in considerazione le cifre meno casuali del numero generato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Ho sbagliato il copia-incolla, la versione giusta era quella sotto..

    La sera non connetto..


    Ciao

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.