View Full Version : [C] rand() generare numero casuale da intervallo non consecutivo
buongiorno a tutti,
qualcuno sa dirmi come si fa con la funzione rand() a generare numeri casuali da un intervallo di numeri non consecutivi?
ad esempio generare ogni volta un numero casuale dal gruppo: 6, 10, 14, 18, 22.
grazie a tutti!!!
BlackAuron
11-12-2009, 10:14
Mettili in un array, e genera un numero casuale compreso tra 0 e la lunghezza dell'array.
A quel punto,
int *a = callolc(N,sizeof(int));
int i;
a[0] = 1; ... a[N-1] = 3;
srand(time(NULL));
printf("%d",a[rand() % N]);
ti ringrazio ma non devo usare l'array per risolvere il problema e ti spiego perchè:
sul libro da cui sto facendo gli esercizi i vettori stanno al capitolo successivo quindi si presuppone che non siano necessari per risolvere il problema.
L'unica cosa è fare quattro if o uno switch.
Estrai un numero fra 0 e 4 ed in base al numero estratto scegli il numero.
Il procedimento più "naturale" è comunque quello postato sopra.
Edit: non avevo letto bene la sequenza dei numeri. Non serve alcun if o switch. Leggi bene la sequenza di numeri e nota che puoi scrivere una funzione che li possa rappresentare.
wingman87
11-12-2009, 13:02
Ti avevo risposto nel vecchio thread che è stato chiuso.
Teo@Unix
11-12-2009, 13:19
rand() ritorna un numero "pseudo-casuale" sempre dallo stesso "seme", per ottenere quel che dici senza usare nessun tipo di iterazione dovresti poter usare questo gruppo di funzioni:
#include <stdlib.h>
int rand(void);
void srand(unsigned int seed);
intendo dire che srand() inizializza un nuovo seme per rand(), non ho tempo di fare una prova ma potresti utilizzarli tipo così:
...
srand(tuo_gruppo_n);
number = rand();
...
Teo@Unix: sinceramente non ho capito cosa intendi con
srand(tuo_gruppo_n);
Credo che rand e srand li sappia usare. La domanda era più specifica.
Se non c'è una relazione fra i numeri bisogna ad ogni costo usare un vettore (o uno switch o una serie di if se non puoi usare i vettori).
Se c'è una relazione fra i numeri, come in questo caso, allora non serve niente, basta trovare una funzione che da un numero compreso fra 0 e N calcola il corrispondente elemento da ritornare.
Teo@Unix
11-12-2009, 14:09
scusate ho letto un pò velocemete ... pensavo riferisse all'uso di rand()...
si in effetti in questo caso non dovrebbe servirgli nulla ne array ne iterazioni.
la cosa è molto più complicata di quanto sembra.....
cmq l'esercizio è chiaro:
per ognuno dei seguenti gruppi di interi, scrivere una singola istruzione che visualizzi un numero casuale tratto dal gruppo.
a) 2, 4, 6, 8, 10
b) 3, 5, 7, 8, 11
c) 6, 10, 14, 18, 22
divertiamoci!:muro:
E' molto facile, almeno la a e la c sono immediati. Per la b ad occhio c'è un 9 prima di 11.
Hai presente quei giochini in cui c'è una sequenza di numeri e devi indovinare il successivo. Qui è uguale, devi capire la formula matematica che permette di generare i numeri partendo da un numero compreso fra 0 e N-1.
Considera la prima serie:
S(0) = 2
S(1) = 4
S(2) = 6
S(3) = 8
S(4) = 10
Devi trovare la formula matematica di S(x) che ti permette di generare i vari valori.
Esempio semplice:
S(0) = 1
S(1) = 2
S(2) = 3
S(3) = 4
S(4) = 5
S(x) = x + 1
ESSE-EFFE
11-12-2009, 15:01
la cosa è molto più complicata di quanto sembra.....
Viste le sequenze di numeri, non è nulla di complicato, come già ti hanno detto. Però non credo sia possibile con una singola "istruzione", casomai con una singola riga di codice (per quanto possa valere questa frase).
b) 3, 5, 7, 8, 11
Sicuro sia un 8 e non un 9?
Per la b ad occhio c'è un 9 prima di 11.
sorry! c'è un nove.
cmq io l'ho capita perfettamente la sequenza di numeri il problema per me resta sempre quello di generarli con rand rispettando la traccia dell'esercizo
Non li devi generare con la sola rand !!! Ma con una sola riga di codice (sola istruzione è fuorviante) in cui c'è rand di mezzo:
S(0) = 1
S(1) = 2
S(2) = 3
S(3) = 4
S(4) = 5
Edit: avevo scritto un obbrobrio matematico :D
S(x) = x + 1
Per scrivere tutto su una riga con rand:
y = rand() % 5 + 1;
PS: lo so che il modulo non rispetta la legge delle probabilità :D
S(0) = 1
S(1) = 2
S(2) = 3
S(3) = 4
S(4) = 5
ma sbaglio o questo S(x) è un array???:Prrr:
ESSE-EFFE
11-12-2009, 15:15
il problema per me resta sempre quello di generarli con rand rispettando la traccia dell'esercizo
Guarda l'esempio che hanno postato... devi usare la funzione rand per generare sempre valori nel range 0...4. E poi da lì, tramite una semplice formula che devi trovare, otterrai i valori degli insiemi richiesti.
in effetti con l'array sarebbe semplicissmo mi basterebbe creare un array con i valore 2,4,6,8,10 per esempio e generare con rand() l'indice dell'array e quindi il valore....:muro:
Guarda l'esempio che hanno postato... devi usare la funzione rand per generare sempre valori nel range 0...4. E poi da lì, tramite una semplice formula che devi trovare, otterrai i valori degli insiemi richiesti.
lo so ma io la "semplice" formula non l'ho trovata....
illuminami!
ma sbaglio o questo S(x) è un array???:Prrr:
No, era solo per dirti i valori che assumeva il calcolo a seconda del parametro x.
Ribadisco:
Sequenza 1, 2, 3, 4, 5
y = rand() % 5 + 1;
ESSE-EFFE
11-12-2009, 15:24
lo so ma io la "semplice" formula non l'ho trovata....
illuminami!
Scusa eh, se un insieme fosse 1, 2, 3, 4, 5 la formula quale sarebbe?
E se fosse 0, 2, 4, 6, 8?
ragazzi ma non mi avete dato una risposta concreta
Ribadisco:
Sequenza 1, 2, 3, 4, 5
y = rand() % 5 + 1;
questo lo so anche io ma il problema è (come il titolo del thread) gruppo di numeri "non consecutivi"
Ti ricordo che fra le operatori matematici di base ci sono +, -, *, /
come puoi arrivare dalla sequenza 1, 2, 3, 4, 5 alla sequenza 2, 4, 6, 8, 10, modificando la formula sotto ?
y = rand() % 5 + 1;
Che relazione c'è fra i vari elementi di uguale ordine delle due sequenze ?
non lo so è per questo che ho aperto un thread ti pare?
Prendi ogni elemento di una sequenza e fanno il rapporto.
Prendi ogni elemento di una sequenza e fanno il rapporto.
???????????
Fai il divisione fra:
1, 2, 3, 4, 5
2, 4, 6, 8, 10
Ovviamente fra elementi di eguale ordine. Cosa noti ?
che è sempre 2 il risultato e con questo?
che è sempre 2 il risultato e con questo?
Ti sembra un caso ? Ogni elemento della seconda sequenza è il doppio di quello dell'altra.
Quindi cosa devi modificare in
y = rand() % 5 + 1;
per avere gli elementi della seconda sequenza invece di quelli della prima ?
y = (rand() % 5 + 1)*2;
così?
y = (rand() % 5 + 1)*2;
così?
Basta che tu faccia qualche calcolo a mano, così puoi verificare o meno.
mi viene da pensare che per
a: y = (rand() % 5 + 1)*2;
b: y = ((rand() % 5 + 1)*2)+1;
c: y = (((rand() % 5 + 1)*2)+1)*2;
perfetto!
con una singola istruzione!
ti ringrazio ad un certo punto ho cominciato ad innervosirmi come hai potuto notare ma queste cose ti danno ai nervi:muro:
grazie ancora
wingman87
11-12-2009, 18:24
Sono contento che ci sei arrivato da solo, comunque ribadisco che ti avevo risposto nel vecchio thread dandoti la formula...
Sono contento che ci sei arrivato da solo, comunque ribadisco che ti avevo risposto nel vecchio thread dandoti la formula...
E meno male che non l'ha vista ;)
wingman87
11-12-2009, 18:52
E meno male che non l'ha vista ;)
Sì, alla fine sì, però mi sentivo un po' ignorato :cry:
Sì, alla fine sì, però mi sentivo un po' ignorato :cry:
La prossima volta magari non risolvere l'esercizio completamente ;)
wingman87
11-12-2009, 19:15
La prossima volta magari non risolvere l'esercizio completamente ;)
Hai ragione, non mi è venuto un modo per spiegarlo e così gli ho dato subito la soluzione. Avrei dovuto rifletterci di più
BlackAuron
11-12-2009, 23:40
ti ringrazio ad un certo punto ho cominciato ad innervosirmi come hai potuto notare ma queste cose ti danno ai nervi:muro:
forse sono io "malato", ma trovo che l'individuazione di algoritmi per la soluzione di problemi in modo ottimale sia uno degli aspetti più interessanti della programmazione ... vedila come una sfida, e magari eviterai di innervosirti.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.