# same values using randi setting seed as default

조회 수: 17 (최근 30일)
Salvatore Mazzarino . 2012년 9월 21일
I'm using randi to generate rand integer valeus but I get the same values two times in my vector. example
rng default;
for i = 1:4
end
9
10
2
10
I wouldn't get the same values. I would get a vector where every values is different. I have to set rng default in this way I can obtain at every run of my scripts the same randi values.

댓글을 달려면 로그인하십시오.

### 채택된 답변

Sean de Wolski 2012년 9월 21일
See randperm if you do not want duplicate values:
randperm(10,4)
##### 댓글 수: 2이전 댓글 1개 표시이전 댓글 1개 숨기기
Sean de Wolski 2012년 9월 21일
The second argument was added in 11b I believe when randperm was rewritten as builtin.

댓글을 달려면 로그인하십시오.

### 추가 답변 (4개)

Wayne King 2012년 9월 21일
편집: Wayne King 님. 2012년 9월 21일
I'm not sure exactly what you're asking here. If you are calling
randi(10)
even a small number of times (here 4 times), then I would expect that you would get repeated values with a substantial probability. There are only ten values to choose from.
With respect to:
I wouldn't get the same values. I would get a vector where every values is different. I have to set rng default in this way I can obtain at every run of my scripts the same randi values.
If you use rng with a seed, then you will obtain the same values every time. Are you asking for a seed where you will get 4 different values?
For example:
rng(100)
x = randi(10,4,1);
Also, why are you going randi() in a for loop like that, you can just create a vector and be done with it.
rng default;
x = randi(10,4,1);
##### 댓글 수: 2이전 댓글 1개 표시이전 댓글 1개 숨기기
Wayne King 2012년 9월 21일
then if you want some randomness, don't seed and call randi(), use Sean's suggestion below.

댓글을 달려면 로그인하십시오.

Peter Perkins 2012년 9월 21일
As others have said, randi is for "sampling with replacement", while randperm is for "sampling without replacement". If you happen to have the Statistics Toolbox, you will also find the datasample function (a newer replacement for randsample) that provides both kinds of sampling, as well as weighted versions of both.
You code snippet showed a loop with repeated calls to randi. If you need to be able to sample without replacement from 1:n in repeated calls, you'll need to maintain some kind of record of what values have already been drawn. That's not hard to do, but the magic of nested functions allows you to do this in a very nice way:
function s = makeWORSampler(n)
last = 0;
values = randperm(n);
s = @worSampler;
function x = worSampler(k)
if last+k > n
error('Not enough values remaining to be sampled.');
end
x = values(last+(1:k));
last = last + k;
end
end
>> s = makeWORSampler(10)
s =
@makeWORSampler/worSampler
>> s(5)
ans =
8 9 2 10 3
>> s(4)
ans =
7 4 1 5
>> s(1)
ans =
6
>> s(1)
Error using makeWORSampler/worSampler (line 7)
Not enough values remaining to be sampled.
Hope this helps.
##### 댓글 수: 0이전 댓글 -1개 표시이전 댓글 -1개 숨기기

댓글을 달려면 로그인하십시오.

Daniel Shub 2012년 9월 21일
Do you want something like
temp = randperm(10);
In this way heads will always have 4 values. These values will be chosen without replacement from the integers between 1 and 10 inclusive.
##### 댓글 수: 0이전 댓글 -1개 표시이전 댓글 -1개 숨기기

댓글을 달려면 로그인하십시오.

Javier 2012년 9월 21일
편집: Javier 님. 2012년 9월 21일
Go to the help of Matlab (mine M2012Ra) and search for "Updating Your Random Number Generator Syntax"
for i = 1:4
rng('shuffle');
end
Javier

댓글을 달려면 로그인하십시오.

### 카테고리

Help CenterFile Exchange에서 Random Number Generation에 대해 자세히 알아보기

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!