The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Генератор случайных чисел С, !*! Anton_K, 22-Сен-05, 14:33  [смотреть все]
Подскажите пожалуйста какая функция возвращает случайное число в заданном диапазоне.
Перепробывал уже почти все функции из stdlib.h (может не разобрался)
  • Генератор случайных чисел С, !*! enot, 14:51 , 22-Сен-05 (1)
    >Подскажите пожалуйста какая функция возвращает случайное число в заданном диапазоне.
    >Перепробывал уже почти все функции из stdlib.h (может не разобрался)

    1. Написать свою фнкцию на основе rand()
    rand() возвращает от 0 до RAND_MAX
    в man rand есть пример для диапазона 0-10

    2. Поискать в другом месте.

  • Генератор случайных чисел С, !*! chip, 20:10 , 22-Сен-05 (2)
    >Подскажите пожалуйста какая функция возвращает случайное число в заданном диапазоне.
    >Перепробывал уже почти все функции из stdlib.h (может не разобрался)

    Матчасть все же следует знать ;) Если Ваш диапазон не выходит за RAND_MAX, то:

    <начало диапазона> + rand() % <диапазон>.

    , где диапазон = <максимальный элемент> - <начальный элемент> + 1

    Т.е. для (3, 11) необходимо:

    3 + rand() % (8 + 1);

  • Генератор случайных чисел С, !*! Anton_K, 12:33 , 23-Сен-05 (3)
    Ваши генераторы хороши, но есть один подвох -
    при запуске программы выдающей ряд случайных величин ряд выдаётся одинаковый в каждом запуске этой программы. Можно ли это избежать?
    При завершении работы Linux, во время остановки служб есть сообщение о записи состояния генератора случайных чисел, можно ли использовать его?
    • Генератор случайных чисел С, !*! ihor, 13:23 , 23-Сен-05 (4)
    • Генератор случайных чисел С, !*! jd, 13:32 , 23-Сен-05 (5)
    • Генератор случайных чисел С, !*! Anton_K, 15:36 , 23-Сен-05 (6)
      Написал таки
      Для моих задач подходит
      Выдаёт разные ряды случайных чисел в промежутки запуска программы не
      менее миллисекунды

      #include <stdlib.h>
      #include <stdio.h>
      main(int argc, char **argv[])
      {
      static int randx=1; //Zavedomo zadannoe zerno
      FILE *uptime;
      float time;
      long int t;
      int i;  /* Dlina ryada sluchainyh chisel */
      int a,b; /*Granicy diapazona, mojno budet zadavat' iz shella v args*/
      a=10;
      b=100;
      /*Vychislenie sluchainogo zerna*/
          uptime=fopen("/proc/uptime","r");
          fscanf(uptime,"%f",&time);
          fclose(uptime);
          time*=randx;
          t=time;
          time=time-t;
          randx=time*10000; /*chem bolshe mnojitel tem sluchainee zerno*/
          printf("Randx = %d; Time = %f\n",randx,time);    
      /*Raspechatka ryada sluchainyh chisel*/
      for(i=0;i<10;i++)
          {
          t=a + ((randx * 25173 + 13849)%65536) % ((b-a) + 1);
          randx = (randx * 25173 + 13849)%65536;
          printf("%d\n",t);
          }
      }

      повторений не замечено

      • Генератор случайных чисел С, !*! chip, 18:45 , 23-Сен-05 (8)
        > uptime=fopen("/proc/uptime","r");
        > fscanf(uptime,"%f",&time);

        Более красивым будет чтение из /dev/[u]random.

      • Генератор случайных чисел С, !*! samara, 01:10 , 26-Сен-05 (9)
        Привет
        я опаздал?!
        у меня есть примерчик из книги на всякий случай

        #include <iostream.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <assert.h>
        #include <sys/stat.h>
        #include <sys/types.h>
        #include <fcntl.h>
        #include <unistd.h>

        int random_number(int min_number, int max_number);

        int main(int argc, char* argv[])
        {
            int min_number;
            int max_number;
            int r_number;
            
            if(argc<2){
            cout << "Usage: random_number min_number max_number\n";
            exit(1);
            }
            
            min_number = atoi(argv[1]);
            max_number = atoi(argv[2]);
            
            r_number = random_number(min_number, max_number);
            
            cout << "random number is " << r_number << "\n";
            
            return 0;
        }

        int random_number(int min, int max)
        {
            static int dev_random_fd = -1;
            
            char* next_random_byte;
            int bytes_to_read;
            unsigned random_value;
            
            assert(max > min);
            
            if(dev_random_fd == -1){
            dev_random_fd = open("/dev/random", O_RDONLY);
            
            assert(dev_random_fd != -1);
            }
            
            next_random_byte = (char*) &random_value;
            bytes_to_read = sizeof (random_value);
            
            do{
            int bytes_read;
            bytes_read = read(dev_random_fd, next_random_byte, bytes_to_read);
            bytes_to_read -= bytes_read;
            next_random_byte += bytes_read;
            }while(bytes_to_read > 0);
            
            return min + (random_value % (max - min +1));
        }

    • Генератор случайных чисел С, !*! chip, 18:44 , 23-Сен-05 (7)
      >При завершении работы Linux, во время остановки служб есть сообщение о записи
      >состояния генератора случайных чисел, можно ли использовать его?

      перед вызовом rand() необходимо вызвать srand()

      srand(time(NULL));

      Куда более красивым вариантом является чтение из /dev/random (или /dev/urandom об отличиях читайте статьи) произвольного seed, который будет использован при вызове srand();

      • Генератор случайных чисел С, !*! Floppy Formator, 05:32 , 27-Сен-05 (10)
        Да, а перед тем, как rand() делить на RAND_MAX, я ещё (float) делаю, а то все компилеры, которые я юзал, частное двух целых тоже в int записывали.

        А вообще, кажется, в stdlib.h есть функция drand48(), она вообще возвращает float от 0 до 1, то есть, по идее, является аналогом случайной величины с равномерным распределением в математике.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру