2014-10-31 6 views

risposta

8

Creare numeri interi casuali compresi tra -3 e 2, ma sostituire gli zeri con 3s:

x = randi([-3,2],4);x(x==0)=3 
4

è possibile utilizzare un approccio iterativo per verificare la presenza di zeri e sostituirli con un insieme ridotto di elementi randomizzati entro lo stesso intervallo [-3,3]. Continuiamo a farlo fino a quando non ci sono più zero.

Il codice per ottenere un tale approccio sarebbe qualcosa di simile -

N = 4; %// datasize 
x1 = randi([-3,3],N); %// the first set/iteration of random numbers 

done = false; %// flag to detect if any zeros are left after iterative substitution 
while ~done %// keep the loop running until no zeros are found 
    x1((x1==0)) = randi([-3,3],numel(find(x1==0)),1); %// substitute zeros with 
               %// smaller set of random numbers 
    done = all(x1(:)~=0); 
end 
+1

è corretto? Voglio dire, i grafici di probabilità. La soluzione di David casse numeri con uguale probabilità, quindi cambia uno di "indice" o valore. Non dovrebbe avere una quantità maggiore di 3. destra? O mi manca qualcosa? –

+0

@AnderBiguri Sì, la seconda trama è quella con l'approccio di David. – Divakar

+1

Vedo, ma sto cercando di capire (faccio davvero schifo alle statistiche) perché ha una maggiore quantità di 3. –

7

@ David fornisce una soluzione chiara per il vostro problema specifico. Ma la seguente soluzione funzionerà per qualsiasi serie di numeri (nota, non è necessario che siano interi), anche se l'ho impostato per il tuo problema specifico.

OutputSize = [20, 1]; %Size of output matrix 
A = [-3; -2; -1; 1; 2; 3]; %Vector of numbers you want to sample from (can be whatever you want) 
x = A(randi(length(A), OutputSize)); %We randomly select the indices of A 

si potrebbe desiderare di trasformare il sopra in una funzione con ingressi A e OutputDim.

Si potrebbe anche elementi ri-campione di una matrice di celle che utilizzano questo metodo ...

EDIT: rettificato il codice per permettere matrice di uscita di ogni misura seguendo il suggerimento del @Divakar nei commenti

+1

Approccio abbastanza intelligente! E sembra essere uniformemente distribuito! +1 per un ottimo lavoro! – Divakar

+1

Inoltre, poiché OP sta cercando una matrice 'N x N', perché non usare invece' [N N] '? – Divakar

+0

@Divakar Grazie, e buon suggerimento. Ho fatto un ulteriore passo avanti e ho permesso all'utente di specificare un array di output di qualsiasi dimensione. –

2
non

Probabilmente la soluzione più veloce, ma c'è una funzione randsample nel Statistics Toolbox che fa proprio questo:

m = 4; %// number of rows 
n = 4; %// number of columns 
values = [-3:-1, 1:3]; %// values to sample from 
x = reshape(randsample(values, m*n, true), [m n]); 
Problemi correlati