Как я могу генерировать случайные двойники в C? - PullRequest
1 голос
/ 19 апреля 2019

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

Вот еще один дополнительный контекст. Со страницы 139 из этой книги http://mimoza.marmara.edu.tr/~msakalli/cse706_12/SkienaTheAlgorithmDesignManual.pdf, точнее, страницы 151 из PDF, мне пришлось решить проблему 4.3, которую я сделал. Однако мне нужно было сгенерировать случайный ввод для этого проблема, и поскольку мне приходится иметь дело с действительными числами, скорее всего, потребуется сгенерировать double чисел. Проблема в том, что я не знаю, какой диапазон выбрать для этого случая при генерации действительных чисел.

Ответы [ 4 ]

3 голосов
/ 19 апреля 2019

Чтобы получить случайное значение double в диапазоне [-DBL_MAX ....DBL_MAX] с примерно равным шансом любого появления double, случайным образом заполните double. Отклонить не конечные.

#include <math.h>
#include <stdlib.h>

double rand_finite_double(void) {
  union {
    double d;
    unsigned char uc[sizeof(double)];
  } u;
  do {
    for (unsigned i = 0; i < sizeof u.uc; i++) {
      u.uc[i] = (unsigned char) rand();
    }
  } while (!isfinite(u.d));
  return u.d;
}

Несколько линейно неэффективно, учитывая, что каждая итерация цикла обычно генерирует только 8 битов.

2 голосов
/ 19 апреля 2019

для примера от 0 до макс .:

double pseudorand(double max)
{   
    srand((unsigned) time(0));
    return (max / RAND_MAX) * rand();
}

или от -макс до макс.

double pseudorand(double max)
{   
    srand((unsigned) time(0));
    return (rand() > RAND_MAX / 2 ? -1 : 1) *(max / RAND_MAX) * rand();
}

https://onlinegdb.com/SyqGH9PqN

1 голос
/ 19 апреля 2019

C rand() возвращает целое число, обычно 32 бита. Двойник имеет 53 бита мантиссы. Таким образом, чтобы создать хороший случайный дубль, вам нужно сгенерировать 53 случайных бита. Попробуйте что-то вроде этого:

double rd() {
    uint64_t r53 = ((uint64_t)(rand()) << 21) ^ (rand() >> 2);
    return (double)r53 / 9007199254740991.0; // 2^53 - 1
}

Это вернет двойное значение в интервале [0, 1]

0 голосов
/ 19 апреля 2019

Как я могу генерировать случайные двойные числа в C?

Никаких наворотов, но вы начнете:

double drand ( double low, double high )
{
    srand((unsigned int)clock());
     return ( (double)rand() * ( high - low ) ) / (double)RAND_MAX + low;
}

Для low = 10.0;
и high = 1000.0
вызов этой функции сгенерирует одно значение:
10 >= value <= 1000.0

Адаптировано из этого примера .

...