Torna indietro   Hardware Upgrade Forum > Software > Programmazione

 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint
Abbiamo intervistato Sumit Dhawan, CEO di Proofpoint, per capire come stia cambiando il mondo della sicurezza con l'avvento dell'intelligenza artificiale e con il ritmo sempre più serrato a cui vengono trovate vulnerabilità nel software. Un problema significativo, che richiederà del tempo per essere risolto (o quantomeno arginato)
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2007, 18:43   #1
keiler
Member
 
Iscritto dal: Mar 2007
Messaggi: 36
[C]numerosi numeri casuali

Ciao a tutti,vorrei fare un programma il poker. Solo che mi serve da generare numeri casuali da 1 a 24 e da 0 a 100...Ho provato utilizzando :
srand(time(0));
x =rand() % 24+1;

il problema è che andando in funzione del tempo, e avendo necessità di randomizzare 5 numeri consegutivi, mi vengono tutti numeri uguali. Se invece metto un if impedendo di darmi lo stesso numero mi da' numeri a intervalli di 3 in 3....
Ho provato a vedere la soluzione che davavate su un'altro post, ma non ho capito nulla, e soprattutto il mio problema è che dovendolo portale al professore devo capire il codice....

grazie in anticipo!
keiler è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 19:31   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da keiler Guarda i messaggi
Ciao a tutti,vorrei fare un programma il poker. Solo che mi serve da generare numeri casuali da 1 a 24 e da 0 a 100...
Quindi devi generare N numeri unici.

Questo è un mio codice di esempio:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct
{
    int *values;
    int  size;
} UNIQUE_RANDOM;

int rand_int (int min, int max)
{
    double d;

    d = rand () / (RAND_MAX+1.0);
    return ((int) (d * (max-min+1))) + min;
}

int UniqueRandom_Init (UNIQUE_RANDOM *ur, int min, int max)
{
    int  size, i;
    int *values;

    if (min > max)
        return 0;

    size = max - min + 1;

    values = (int*) malloc (size * sizeof (int));

    if (values == NULL)
        return 0;

    for (i = 0; i < size; i++)
        values[i] = min + i;

    ur->values = values;
    ur->size = size;

    return 1;
}

int UniqueRandom_Extract (UNIQUE_RANDOM *ur, int *value_out)
{
    int idx;

    if (ur == NULL || value_out == NULL || ur->size == 0)
        return 0;

    idx = rand_int (0, --ur->size);
    *value_out = ur->values[idx];
    ur->values[idx] = ur->values[ur->size];

    return 1;
}

void UniqueRandom_Free (UNIQUE_RANDOM *ur)
{
    if (ur != NULL && ur->values)
        free (ur->values);
}


/*-- Main di prova --*/
int main (void)
{
    UNIQUE_RANDOM ur;
    int num;

    srand ((unsigned int) time (NULL));

    if (UniqueRandom_Init (&ur, -10, 10))
    {
        while (UniqueRandom_Extract (&ur, &num))
            printf ("%d ", num);

        printf ("\n");
        UniqueRandom_Free (&ur);
    }

    return 0;
}
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 22:11   #3
keiler
Member
 
Iscritto dal: Mar 2007
Messaggi: 36
scusa non e' che potresti spiegarmi passaggio per passaggio? che non ci ho capito nulla...innanzitutto cos'e' unique_random? poi io l'int l'ho sempre utilizzato per assegnare una sola variabile, tipo a,b,c,d ecc. mai usando cose tipo:int rand_int (int min, int max)...

non c'e' un metodo un po' piu' semplice? grazie lo stesso!
keiler è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2007, 23:36   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quella è una funzione...sai cosa sono le funzioni ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 07:08   #5
keiler
Member
 
Iscritto dal: Mar 2007
Messaggi: 36
se devo essere sincero mai fatte.......
per questo ho bisogno di qualche spiegazioncina in piu' ^^....
keiler è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 09:25   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da keiler Guarda i messaggi
scusa non e' che potresti spiegarmi passaggio per passaggio? che non ci ho capito nulla...innanzitutto cos'e' unique_random? poi io l'int l'ho sempre utilizzato per assegnare una sola variabile, tipo a,b,c,d ecc. mai usando cose tipo:int rand_int (int min, int max)...
Purtroppo non è facile (e non è breve) spiegare il tutto se non hai conoscenze chiare e precise su cosa sono le strutture, le funzioni, ecc....

Per poter generare N numeri casuali unici (che non si ripetano) c'è un modo molto semplice, adesso ti spiego il concetto tramite un esempio.

Si vuole generare numeri casuali unici compresi tra 10 e 15 (inclusi). Si crea innanzitutto un array di 6 elementi:
Codice:
  0    1    2    3    4    5     <-- indice
+----+----+----+----+----+----+
| 10 | 11 | 12 | 13 | 14 | 15 |
+----+----+----+----+----+----+
A questo punto bisogna generare un numero casuale compreso tra 0 e 5 (inclusi). Supponiamo venga generato il numero 2. In valore all'indice 2 è il 12, pertanto il primo numero casuale unico è il 12.

A questo punto l'array è da "accorciare" dal punto di vista logico. Si prende l'ultimo elemento (il 15) e lo si mette nel "buco" rimasto libero dal numero 12 appena estratto. L'array diventa così:
Codice:
  0    1    2    3    4    5
+----+----+----+----+----+----+
| 10 | 11 | 15 | 13 | 14 |////|
+----+----+----+----+----+----+
Ora bisogna generare un numero casuale compreso tra 0 e 4 (inclusi) ..... e la cosa continua allo stesso modo di prima fino a quando ci sono elementi nell'array.

Chiaro adesso? Io nel mio esempio di codice che ho postato ho sviluppato la cosa in modo da poterla rendere abbastanza riutilizzabile. Ho creato una struttura che permette di gestire questo array "particolare" e 3 funzioni che operano su questa struttura. Una funzione per inizializzare la struttura, una per estrarre i valori e una per terminare l'utilizzo della struttura (fa una free di ciò che è stato allocato).

Nulla di trascendentale .... ma il concetto comunque è quello che ho appena spiegato. Poi sei libero di implementarlo come meglio credi.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 10:17   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Posso provare a fartela un po' più semplice e senza funzioni, magari non hai visto nemmrno le liste...vediamo:
Codice:
int estratti[NUMERO_ELEMENTI];
int numero_estrazioni = 0;
int estratto;
Per ogni estrazione devi fare:
Codice:
/* estraggo un numero fra 0 e (NUMERO_ELEMENTI - numero_estrazioni - 1) */
estratto = (((double)rand()) / (RAND_MAX + 1)) * (NUMERO_ELEMENTI - numero_estrazioni);
numero_estrazioni++;

for(i = 0; i <= estratto; i++)
   if(estratti[i] != 0)
      estratto++;

/* setto a 1 l'elemento corrispondente nel vettore estratti in modo da rendere impossibile l'estrazione dell'elemento nelle prossime estrazioni */
estratti[estratto] = 1;
In estratto hai il numero corretto...
Questa è una versione semplificata, per farti capire meglio cosa fa quello che ti ho scritto sopra:
Codice:
/*l'avresti anche potuto scrivere come: */
estratto = rand() % (NUMERO_ELEMENTI - numero_estrazioni);
/* ma così come l'ho scritto sopra mantengo l'equiprobabilità.
In pratica diminuisco l'intervallo di estrazione di uno per ogni estrazione effettuata, perchè di fatto gli elementi da scegliere sono diminuiti */

numero_estrazioni++;

/*il ciclo avresti potuto scriverlo anche così: */
for(i = 0; i < NUMERO_ELEMENTI; i++)
   if(estratti[i] != 0 && i <= estratto)
      estratto++;

estratti[estratto] = 1;
In pratica incremento il numero estratto per ogni numero già estratto minore del suo valore attuale, questo serve per riportare il numero estratto nell'intervallo originale:
- mettiamo che NUMERO_ELEMENTI sia 10
- dopo la prima estrazione estraggo il numero 1, il ciclo non trova alcun elemento già estratto, setto a 1 estratti[1]
- la seconda estrazione sarà fra 0 e 9
- estraggo 3, 3 deve individuare il quarto numero che non è stato ancora estratto (si parte da zero, quindi zero, uno, due, tre)
- eseguo il ciclo e quando i == 1, trovo la casella segnata ed incremento estratto a 4, infatti il 4 è il quarto numero che non è stato ancora estratto (zero, uno è stato estratto, due, tre, quattro)
E così via per ogni estrazione...

Ad esempio il vettore estratti è fatto così:
NUMERO_ELEMENTI = 10

Estratti è fatto così:
0 1 2 3 4 5 6 7 8 9
1 1 1 1 0 0 1 0 1 0

Quindi abbiamo estratto 6 numeri...

L'estrazione avviene fra 0 e (NUMERO_ELEMENTI - numero_estrazioni - 1), cioè fra 3 (10 - 6 -1). Estraggo 2 (il terzo elemento non estratto).

Ecco cosa avviene nel ciclo:

i = 0 --> estratti[0] è 1, 0 <= estratto: estratto++, quindi 3
i = 1 --> estratti[1] è 1, 1 <= estratto: estratto++, quindi 4
i = 2 --> estratti[2] è 1, 2 <= estratto: estratto++, quindi 5
i = 3 --> estratti[3] è 1, 3 <= estratto: estratto++, quindi 6
i = 4 --> estratti[4] è 0: quindi non incremento estratto
i = 5 --> estratti[5] è 0: quindi non incremento estratto
i = 6 --> estratti[6] è 1, 6 <= estratto: estratto++, quindi 7
i = 7 --> estratti[7] è 0: quindi non incremento estratto
i = 8 --> 8 non <= estratto: quindi non incremento estratto
i = 9 --> 8 non <= estratto: quindi non incremento estratto

estratto è quindi 7, che corrisponde appunto al terzo elemento libero nel vettore degli estratti
Setto a 1 l'elemento corrispondente e sono pronto a poter utilizzare il numero che ho estratto...

Nel ciclo che ho scritto per primo evito di fare le ultime due iterazioni del ciclo.
Ovviamente se vuoi ricominciare l'estrazione dall'inizio devi azzerare il vettore estratti e mettere numero_estrazioni a 0.

Ultima modifica di cionci : 18-04-2007 alle 10:20.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 11:21   #8
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da keiler Guarda i messaggi
se devo essere sincero mai fatte.......
per questo ho bisogno di qualche spiegazioncina in piu' ^^....
Senti, non è che le nostre spiegazioni possono essere sufficienti se tu non studi.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 13:32   #9
keiler
Member
 
Iscritto dal: Mar 2007
Messaggi: 36
Non è che non studio...è che a scuola ci siamo fermati al ciclo for....(sto alle superiori) :P e siccome ero riuscito a fare il filetto volevo provare qualcosa di più complicato e pensavo che la generazione di numeri casuali fosse molto più semplice. Comunque ringrazio tutti, più o meno ho capito il ragionamento...ora vedo di andarmi a vedere le cose che ancora non so...grazie ancora ^^
keiler è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 14:16   #10
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da keiler Guarda i messaggi
Non è che non studio...è che a scuola ci siamo fermati al ciclo for....(sto alle superiori)
Allora ti chiedo scusa.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 14:40   #11
keiler
Member
 
Iscritto dal: Mar 2007
Messaggi: 36
vabbeh tranquillo! ^^
Sono io che pretendo un po' troppo! :P
Comunque ultima domandina...Visto che a scuola non si fa niente... mi sono comprato un libro di c++, mi conviene iniziare con quello o meglio che faccio ancora un bel po' di c prima di passare al c++?
keiler è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 18:44   #12
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
Quote:
Originariamente inviato da keiler Guarda i messaggi
Visto che a scuola non si fa niente
Il che, peraltro, è il vero problema della scuola italiana.
Potenzialmente, si potrebbe fornire una preparazione paragonabile almeno a quella di un primo anno di università all'estero.
Solo che, se non si fanno lavorare gli alunni, questo è impossibile.
Quote:
mi sono comprato un libro di c++
Spero non sia lo Schildt.
Quote:
mi conviene iniziare con quello o meglio che faccio ancora un bel po' di c prima di passare al c++?
Io suggerisco di fare bene il C, che hai già iniziato e che devi studiare per la scuola. Poi, semmai, passerai a qualcos'altro.
Visto che voglia di lavorare ne hai, prendi pure il Kernighan&Ritchie che è il punto di riferimento di tutti i programmatori C seri.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2007, 21:59   #13
oNaSsIs
Member
 
L'Avatar di oNaSsIs
 
Iscritto dal: Apr 2007
Messaggi: 182
Volevo fare i complimenti a andbin per l'algoritmo che ha usato per generare numeri casuali diversi...molto utile e semplice...non lo conoscevo...
oNaSsIs è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
La Cina risponde a NVIDIA con LongCat-2....
Godox C100: la prima fotocamera del marc...
Boom IA e affitti fuori controllo: chi l...
Le RTX 5000 abbattono il muro dei 4 GHz,...
Onimusha: Way of the Sword non sar&agrav...
Anche Microsoft anticipa al 2029 il pass...
Sei falle in AirDrop e Quick Share: cras...
Altri tagli in arrivo in casa XBOX: a ri...
Quando l'IA entra nei processi: due part...
La contea con più data center del...
Galaxy Ring 2, Samsung conferma lo svilu...
1TB e velocità di scrittura garan...
Volkswagen apre alla produzione europea ...
Hide My Email doveva proteggere l'identi...
Videogiochi che scompaiono: si ferma al ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:02.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v