PDA

View Full Version : [C] rand() generare numero casuale da intervallo non consecutivo


bobosg
11-12-2009, 09:36
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]);

bobosg
11-12-2009, 11:27
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.

cionci
11-12-2009, 11:56
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();
...

cionci
11-12-2009, 13:44
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.

bobosg
11-12-2009, 14:44
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:

cionci
11-12-2009, 14:59
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?

bobosg
11-12-2009, 15:03
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

cionci
11-12-2009, 15:11
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

bobosg
11-12-2009, 15:14
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.

bobosg
11-12-2009, 15:16
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:

bobosg
11-12-2009, 15:18
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!

cionci
11-12-2009, 15:18
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.

cionci
11-12-2009, 15:22
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?

bobosg
11-12-2009, 15:26
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"

cionci
11-12-2009, 15:30
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 ?

bobosg
11-12-2009, 15:37
non lo so è per questo che ho aperto un thread ti pare?

cionci
11-12-2009, 15:39
Prendi ogni elemento di una sequenza e fanno il rapporto.

bobosg
11-12-2009, 15:40
Prendi ogni elemento di una sequenza e fanno il rapporto.


???????????

cionci
11-12-2009, 15:41
Fai il divisione fra:

1, 2, 3, 4, 5
2, 4, 6, 8, 10

Ovviamente fra elementi di eguale ordine. Cosa noti ?

bobosg
11-12-2009, 15:43
che è sempre 2 il risultato e con questo?

cionci
11-12-2009, 15:49
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 ?

bobosg
11-12-2009, 15:53
y = (rand() % 5 + 1)*2;

così?

cionci
11-12-2009, 15:55
y = (rand() % 5 + 1)*2;

così?
Basta che tu faccia qualche calcolo a mano, così puoi verificare o meno.

bobosg
11-12-2009, 15:57
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;

cionci
11-12-2009, 15:59
Esattamente

bobosg
11-12-2009, 16:01
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...

cionci
11-12-2009, 18:50
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:

cionci
11-12-2009, 19:02
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.

bobosg
15-12-2009, 14:29
cmq grazie a tutti!