Равномерное производство - PullRequest
       7

Равномерное производство

0 голосов
/ 04 сентября 2018

Я задал этот вопрос Произведите 100 данных случайным образом или выберите, если это возможно несколько дней назад. Теперь, когда я хочу выбрать номер 10 случайно, из набора i / 1 * 300 /. я использую этот код:

 Set       I     /0*300/
      picks /p1*p10/;
 Scalar    pick;
Parameter MyParameter(I);

 MyParameter(I) = 0;
 loop(picks,
  pick = uniformInt(1, card(I));

 * Make sure to not pick the same one twice
  while(sum(I$(pick=ord(I)),MyParameter(I))=1,
    pick = uniformInt(1, card(I))
    Display 'here';
   );

   MyParameter(I)$(pick=ord(I))=1;
 );
 Display MyParameter;

Я хочу запустить этот код несколько раз, и я хочу выбрать 10 случайных чисел в первый раз. 20 выбор во второй раз, 30 выбор в третий раз, ..., 100 выбор в 10-й.

Кроме того, мне нужно каждый раз выбирать новые номера, Я имею в виду, что числа, выбранные во второй раз, должны отличаться от номеров, выбранных в первый раз.

ноiformInt Каждый раз выбирает повторяющиеся числа. Например, результаты для выбора 10 и 20 следующие:

* for      picks /p1*p10/;
 21  1.000,    52  1.000,    68  1.000,    88  1.000,    91  
 1.000,    106 1.000
 151 1.000,    166 1.000,    254 1.000,    258 1.000

И результат для 20 выбранных:

 * for      picks /p1*p20/;

 21  1.000,    40  1.000,    49  1.000,    52  1.000,    68  
  1.000,    76  1.000
  88  1.000,    91  1.000,    106 1.000,    132 1.000,    151 
  1.000,    166 1.000
  175 1.000,    193 1.000,    202 1.000,    230 1.000,    254 
   1.000,    258 1.000
  299 1.000

21,52,68,88,91,106,151,166,254,258 повторяются во второй раз.

Что я должен делать, чтобы избежать дублирования номеров каждый раз? Почему эта функция не производит разные числа?

1 Ответ

0 голосов
/ 07 сентября 2018

я искал и нашел свой ответ в https://support.gams.com/gams:random_number_generator_in_gams

я хотел следующий код:

  Set       I     /0*300/
      picks /p1*p10/;
  Scalar    pick;
  Parameter MyParameter(I);

  MyParameter(I) = 0;
  execseed = 1 + gmillisec(jnow); 
   loop(picks,
     pick = uniformInt(1, card(I));

   * Make sure to not pick the same one twice
    while(sum(I$(pick=ord(I)),MyParameter(I))=1,
     pick = uniformInt(1, card(I))

      );

    MyParameter(I)$(pick=ord(I))=1;
     );
    Display MyParameter;
...