Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1258

 
Vitaly Muzichenko:

Подскажите, что прописать, чтобы получать random 6-значные числа?

Нашёл такое решение

int Random(int min,int max) {
   int v=0;
   MathSrand(GetTickCount());
   while(true) {
      v=MathRand()*2*MathRand();
      if(v>=min && v<=max)
         break;
     }
   return(v);
  }
 
Vitaly Muzichenko:

Нашёл такое решение

Виталий, это не лучший вариант.

Во первых в таком случае лучше использовать цикл do while

Во вторых, на мой взгляд, надёжней получить число больше 6ти знаков при возведении в степень, чем при умножении. Но в этом случае есть возможность получить INF. Но можно ограничить значение степени… В моём примере степень не больше 16.

/********************Script program start function*******************/
void OnStart()
 {
  double dr = 0,
         df = 0;
  srand(GetTickCount());
  do
   {
    dr = fabs(rand());
    df = fabs(rand());
   }
  while((dr == 1 || df == 1) && !IsStopped());
  double dp = pow(dr, fmod(df, 16));
  Print(DoubleToString(fmod(dp, 1000000), 8));
 }/*******************************************************************/

И взять остаток от деления получив шестизначное число.

 
Alexey Viktorov:

Виталий, это не лучший вариант.

Во первых в таком случае лучше использовать цикл do while

Во вторых, на мой взгляд, надёжней получить число больше 6ти знаков при возведении в степень, чем при умножении. Но в этом случае есть возможность получить INF. Но можно ограничить значение степени… В моём примере степень не больше 16.

И взять остаток от деления получив шестизначное число.

Спасибо, заменил часть в коде.

 
Vitaly Muzichenko:

Спасибо, заменил часть в коде.

И что в результате получилось? Я ведь не претендую на непогрешимость…)))

 
Vitaly Muzichenko:

Подскажите, что прописать, чтобы получать random 6-значные числа?

void OnStart()
{
   srand(GetTickCount());
   for(int i = 0; i < 10; i++)
   {
      uint random = rand_32() % 1000000;  // %1000000 --> ограничим 6-ю знаками 
      printf("random = %u", random);
   }
}
//+------------------------------------------------------------------+
uint rand_32()
{
   return(((uint)rand()) << 16 | rand());
}
//+------------------------------------------------------------------+
 
Alexey Viktorov:

И что в результате получилось? Я ведь не претендую на непогрешимость…)))

В результате пришлось оставить, так как было и менее 6-ти знаков

if(v>=min && v<=max)

Igor Makanu:

Вечером попробую.

 
Igor Makanu:

Проскакивают 5-значные


Впрочем, проблема исчерпана, всем спасибо!

 
Vitaly Muzichenko:

Проскакивают 5-значные

да будут

подумал, что задача только не больше 6-ти знаков

как вариант первый знак генерировать с помощью rand()%10

 
Igor Makanu:

да будут

подумал, что задача только не больше 6-ти знаков

как вариант первый знак генерировать с помощью rand()%10

Снова поставил в код

if(v>=min && v<=max)

этого достаточно, функция всё-равно вызывается пару раз в сутки

 
Vitaly Muzichenko:

Снова поставил в код

этого достаточно, функция всё-равно вызывается пару раз в сутки

нет

проще можно

так напишите

uint random = (rand() % 9 + 1) * 1000000 +   // первый знак
                    rand_32() % 100000;      // ограничим 5-ю знаками