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!