2014-10-31 4 views

Odpowiedz

8

Tworzenie losowych liczb całkowitych między -3 i 2, ale zastąpić zera z 3s:

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

Można użyć iteracyjnego podejścia do sprawdzenia zer i zastąpić je z mniejszym zestawem elementów randomizowanych obrębie tego samego przedział [-3,3]. Robimy to, dopóki nie pozostało zero.

Kod osiągnąć takie podejście byłoby coś takiego -

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

Czy jest to prawidłowe? Chodzi mi o to, że wątki są prawdopodobne. Rozwiązanie Dawida tworzy liczby z równym prawdopodobieństwem, a następnie zmienia jeden z "indeksu" lub wartości. Nie powinien mieć większej ilości 3. dobrze? Lub czegoś mi brakuje? –

+0

@AnderBiguri Tak, drugi wątek dotyczy podejścia Davida. – Divakar

+1

Rozumiem, ale staram się zrozumieć (naprawdę ssać statystyki), dlaczego on ma więcej 3. –

7

@David zapewnia schludny rozwiązanie konkretnego problemu. Ale poniższe rozwiązanie będzie działać dla dowolnego zestawu liczb (uwaga, nie muszą to być liczby całkowite), chociaż ustawiłem je dla konkretnego problemu.

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 

może chcesz włączyć powyższe pod funkcji z wejściami A i OutputDim.

można nawet ponownie przykładowe elementy macierzy komórkowej przy użyciu tej metody ...

EDIT: Skorygowana kod, aby umożliwić tablicę wyjściowego dowolnego rozmiaru zgodnie z sugestią @Divakar w komentarzach

+1

Całkiem sprytne podejście! I wydaje się, że jest również rozprowadzany równomiernie! +1 za świetną robotę! – Divakar

+1

Również, ponieważ OP szuka tablicy 'N x N', dlaczego nie użyć zamiast niej' N N]? – Divakar

+0

@Divakar Dzięki, i dobra sugestia. Posunąłem się o krok dalej i pozwoliłem użytkownikowi określić macierz wyjściową o dowolnym rozmiarze. –

2
nie

Prawdopodobnie najszybsze rozwiązanie, ale istnieje randsample funkcja w Statistics Toolbox, że właśnie to robi:

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]); 
Powiązane problemy