uniformInt производит повторяющийся номер

Я задал этот вопрос Сгенерируйте 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-й раз.

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

но uniformInt Каждый раз выбирает повторяющиеся числа. Например, результаты для выбора 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 повторяются во второй раз.

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


person linkho    schedule 04.09.2018    source источник


Ответы (1)


я искал и нашел свой ответ в 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;
person linkho    schedule 07.09.2018