Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] Random

  1. #1

    Random

    Ciao a tutti,
    mi servirebbe sapere se esiste un codice in c che genera una sequenza di numeri casuali ma senza ripetizioni

    ad esempio se voglio fare un random di 4 numeri per 4 volte deve darmi
    1234 o 2134 o 3241 e cosi via... ma mai ripetere 2 volte 1 numero

    al momento ho usato la funzione random e con il tempo di sistema ma non riesco a far uscire cifre distinte... esiste una particolare funzione???

    grazie^^

  2. #2
    Se la funzione rand è progettata bene è ovvio che devi considerare il fatto che un numero di quattro cifre , al cui interno ci siano due cifre uguali , ha la medesima probabilità di essere generato di quello di quattro cifre con le cifre tutte diverse . In effetti quello che tu richiedi è la generazione casuale di permutazioni . A questo punto devi scriverti una funzione ad hoc . Saluti

  3. #3
    il linguaggio anche nel titolo, please
    ...Terrible warlords, good warlords, and an english song

  4. #4
    Originariamente inviato da Johnny_Depp
    il linguaggio anche nel titolo, please
    Mi dice di dover contattare l'amministratore per modificare il messaggio....


    cmq riguardo il programma che genera permutazioni...
    ci stavo pensando un po' su...
    iterativo sembra un casino (piu che altro troppi confronti da fare)
    forse ricorsivo risulta + semplice

    avete qualche spunto?

  5. #5
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Potresti creare una funzione in questo modo

    codice:
    #define CIFRE 9
    #define USED -1
    
    int diamoInumeri[CIFRE]; /*variabile globale*/
    int validi; /*variabile globale*/
    
    /*successivamente crei una funzione che inizializza il vettore*/
    
    void inizializza (int n){
      int i=0;
    
      for (i=0;i<n;i++)
        diamoInumeri[i] = i+1; /*le cifre da 1 a 9 che ci servono*/
    
      validi=n;  /*so che nel vettore ho n elementi validi*/
    }
    
    /*ora serve una funzione che mi generi i numeri casuali che mi servono*/
    
    int generaNumero (){
    
      int indice,
          i=0,
          ritorno;
     
      indice = rand()%validi;
      
      ritorno = diamoInumeri[indice];
    
      for (i=indice;i<validi;i++)
        diamoInumeri[i]=diamoInumeri[i+1];
    
      validi--;
    
      /*con queste due operazioni traslo indietro di una posizione i 
      i numeri validi coprendo quello utilizzato, inoltre decremento il 
      numero di elementi validi*/
    
      return ritorno; 
    
    }
    
    /*ora abbiamo tutte le funzioni che servono, proviamo per esempio a generare un po' di permutazioni delle cifre da 1 a 5*/
    
    while (voglio permutazioni){
    
      inizializza(5) /*così le cifre 6-9 sono inutilizzabili*/
      
      for (i=0;i<5;i++)
        printf ("%d ",generaNumero());
    
      printf ("\n");
    }
    Con queste due funzioni (non ho provato a compilarle, potrebbero contenere qualche errore) dovresti riuscire a fare tutto.

    Ciao!!

  6. #6

    Re: Random

    Originariamente inviato da Vincent81
    Ciao a tutti,
    mi servirebbe sapere se esiste un codice in c che genera una sequenza di numeri casuali ma senza ripetizioni

    ad esempio se voglio fare un random di 4 numeri per 4 volte deve darmi
    1234 o 2134 o 3241 e cosi via... ma mai ripetere 2 volte 1 numero

    al momento ho usato la funzione random e con il tempo di sistema ma non riesco a far uscire cifre distinte... esiste una particolare funzione???

    grazie^^
    Io non ho capito bene cosa devi fare...Prova a speigare bene quali sono gli input e quali devono essere gli output
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Originariamente inviato da Vincent81

    cmq riguardo il programma che genera permutazioni...
    ci stavo pensando un po' su...
    iterativo sembra un casino (piu che altro troppi confronti da fare)
    forse ricorsivo risulta + semplice

    avete qualche spunto?
    Potresti utilizzare il classico algoritmo del gioco della tombola ( visto che siamo nel periodo giusto ):

    1) Inserisci tutte le combinazioni possibili in un array (meglio se usi una lista)
    2) Tramite funzione rand()*grandezza_array 'peschi' nell'array il valore
    3) Cancelli dalla lista/array il valore usato e decrementi 'grandezza_array'
    4) Se 'grandezza_array'>0 torni al unto 2.

    Può andare ?
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    Originariamente inviato da Samuele_70
    Potresti utilizzare il classico algoritmo del gioco della tombola ( visto che siamo nel periodo giusto ):

    1) Inserisci tutte le combinazioni possibili in un array (meglio se usi una lista)
    2) Tramite funzione rand()*grandezza_array 'peschi' nell'array il valore
    3) Cancelli dalla lista/array il valore usato e decrementi 'grandezza_array'
    4) Se 'grandezza_array'>0 torni al unto 2.

    Può andare ?
    La tecnica puo' essere accettabile per un numero di elementi n intorno alla decina , ma troppo dispendioso in termini computazionali per un numero di elementi sufficientemente grande . Le permutazioni di n elementi sono n ! . Per cui avremo : un tempo Tg di generazione più un tempo Tv di verifica. Usando una lista (o un array) il tempo di verifica Tv sarà proporzionale al numero degli elementi della lista .
    P.S. Buon Natale a tutti

  9. #9
    Se stai lavorando su sistemi unix o unix-like, puoi usare il device /dev/random o /dev/urandom (random(4), urandom(4)) e fare qualcosa di simile:

    codice:
    int
    urandint(void)
    {
    	FILE *devurandom;
    	int randomint;
    	if( (devurandom = fopen("/dev/urandom", "rb")) == NULL )
    	{
    		fprintf(stderr, "Impossibile accedere al device /dev/urandom\n");
    		exit(1);
    	}	
    	fread(&randomint, sizeof(int), 1, devurandom);
    	fclose(devurandom);
    	return abs(randomint);
    }
    ovviamente la funzione è da chiamare in un ciclo..

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.