2013-04-17 11 views
12

Vorrei generare un numero casuale compreso tra 1 e 10 utilizzando ad esempio randi([1,10]) ma vorrei escludere un numero singolo, ad esempio 7 - questo numero sarebbe sempre cambiato e specificato in una variabile denominata b.Genera un numero casuale compreso tra 1 e 10 ad eccezione di un numero singolo in matlab

È possibile farlo in qualche modo?

+0

Just loop sul 'Randi ([1,10])' fino a quando il risultato non è uguale 'b'. –

+0

sì ma questo accadrebbe all'interno di un programma e io non sono lì per supervisionarlo. Sto cercando un argomento che ometta b. – user1723765

+2

@ user1723765 Il ciclo e il test possono essere automatizzati. – glglgl

risposta

18

Utilizzare randsample. Ad esempio, per generare un numero compreso tra 1 e 10, escludendo 7, procedere nel modo seguente:

b = 7; 
x = randsample(setdiff(1:10, b), 1); 

Qui setdiff è utilizzato per escludere il valore delle b dal vettore 1:10.

Se non è installato lo Statistics Toolbox, non sarà in grado di utilizzare randsample, in modo da utilizzare rand:

v = setdiff(1:10, b); 
x = v(ceil(numel(v) * rand)); 
+2

Per la seconda soluzione si può usare 'x = v (randi (numel (v)));' –

+1

@MohsenNosratinia Sì, hai ragione. Ma ricorda anche che non c'è 'randi' nelle vecchie versioni di MATLAB. –

+2

Bene, 'randi' è apparso in R2008b e penso che il numero di persone che non dispongono di strumenti per le statistiche sia molto più grande delle persone che lo possiedono su una versione di oltre 5 anni. –

5

Per quelli senza lo Statistics Toolbox:

b = 7; 
pop = 1:10; 
pop(b) = []; 

quindi

pop(randperm(9,1)) 

o per n ra interi ndom da parte della popolazione:

pop(randi(numel(pop), 1, n)) 
+1

'randperm' va bene se non vuoi le ripetizioni. –

+1

@EitanT Hai ragione! Lo cambierò in 'randi' – Dan

+2

+1, ma cambi' 9' in 'length (pop)'. – glglgl

1

Come accennato @EitanT, è possibile utilizzare randsample di farlo, ma penso che così facendo in modo più semplice dovrebbe fare per voi:

>> b = 7; 
>> randsample([1:b-1,b+1:10],1) 

Questo semplicemente campioni un valore casuale dalla matrice [1:b-1,b+1:10] che sarebbe qui

1  2  3  4  5  6  8  9 10 

Oppure analogamente, se la funzione `randsample' non è più disponibile come aveva menzionato @EitanT,

v = [1:b-1,b+1:10]; 
x = v(ceil(numel(v) * rand)); 
+0

Cosa succede se b = 1 o b = 10? –

Problemi correlati