Page 1 of 1
Generate an array of random numbers
Posted: Thu Apr 04, 2019 2:13 pm
by moosavi_69
Dear Friends,
I have defined set
W and parameter
Coef(W) as follows:
I would like to
randomly assign
binary values to
Coef(W); where about %A of elements in
W get 1, and %(100-A) of them get 0. For instance, if A is equal to 70, therefore,
Coef(W) could be one of the following arrays:
Code: Select all
[1 1 0 1 1 0 1 1 0 1]
or
[0 1 1 1 0 0 1 1 1 1]
or
...
Can anyone please help me?
Kind regards,
Amirhossein
Re: Generate an array of random numbers
Posted: Fri Apr 05, 2019 4:30 pm
by Manassaldi
Hi, this is a good challenged! I think this can work.
Code: Select all
*reset the seed for the random number generator.
execseed = 1 + gmillisec(jnow);
Set W /1*10/
select(W);
alias(W,Wp);
select(W)=NO;
Parameter Coef(W)
p
A /70/
;
loop(W$(ord(w) le floor(A*card(W)/100)),
p = uniformInt(1,card(W));
while( sum(Wp$(ord(Wp) eq p),1) eq sum(Wp$(ord(Wp) eq p and select(Wp)),1),
p = uniformInt(1,card(W));
);
select(Wp)$(ord(Wp) eq p) = yes;
Coef(Wp)$(ord(Wp) eq p) = 1;
);
Coef(Wp)$(not select(Wp)) = 0;
display Coef;
Bye!
Re: Generate an array of random numbers
Posted: Fri Apr 05, 2019 4:40 pm
by dirkse
This does what you want. Setting the seed for the random number generator is not required, but it is useful to get different results for different runs.
Code: Select all
Set W /1*10/;
Parameter Coef(W);
scalar a / 0.7 /;
* set the seed in some random way, based on the time
execseed = gmillisec(jnow);
coef(w) = [uniform(0,1) < a];
display coef;
Re: Generate an array of random numbers
Posted: Fri Apr 05, 2019 7:45 pm
by Manassaldi
Hi dirkse, i like your compact implementation.
I tested your code but sometimes I got less than seven items with a value of 1 and sometimes more.
i'm right?
Re: Generate an array of random numbers
Posted: Mon Apr 08, 2019 9:28 am
by moosavi_69
You are right. Unfortunately, the compact method of Mr. dirkse does not always work properly. The suggested method by Mr. Manassaldi works perfectly. Thanks.
Re: Generate an array of random numbers
Posted: Mon Apr 08, 2019 3:36 pm
by dirkse
It seems we need to clarify what the original poster intended. If the intent was to draw a number of samples from a {0,1} distribution, then you would expect to get different numbers of 1s when using different random number seeds. But perhaps the intent was to just permute a given number of 1s. In that case, the problem could be stated more clearly, without using percentages. For example, how would you get 70% of 11 items? If what you want is to randomly set k members of a parameter to 1, you can do this with the shuffle option:
https://www.gams.com/latest/docs/UG_Opt ... ch=shuffle
Code: Select all
set i /1*10/;
parameter c(i);
scalar k 'number of 1s in c' / 4 /;
c(i)$[ord(i) <= k] = 1;
* set the seed in some random way, based on the time
execseed = gmillisec(jnow);
option shuffle = c;
display c;
Re: Generate an array of random numbers
Posted: Mon Apr 08, 2019 3:55 pm
by Manassaldi
I did not know the shuffle option. Thanks for sharing dirkse!