Как Вы генерируете случайное двойное равномерно распределенное между 0 и 1 от C++?

обратите внимание, что self мог на самом деле быть любой допустимый идентификатор Python. Например, мы могли столь же легко записать от примера B Chris:

class A(object):
    def __init__(foo):
        foo.x = 'Hello'

    def method_a(bar, foo):
        print bar.x + ' ' + foo

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

60
задан static_rtti 27 August 2009 в 12:24
поделиться

7 ответов

Старое решение, например:

double X=((double)rand()/(double)RAND_MAX);

Должно соответствовать всем вашим критериям (портативность, стандарт и скорость). очевидно, что сгенерированное случайное число должно быть засеяно, стандартная процедура выглядит примерно так:

srand((unsigned)time(NULL));
55
ответ дан 24 November 2019 в 17:48
поделиться
6
ответ дан 24 November 2019 в 17:48
поделиться

Если скорость - ваша главная забота, я бы просто выбрал

double r = (double)rand() / (double)RAND_MAX;
3
ответ дан 24 November 2019 в 17:48
поделиться

Вы можете попробовать алгоритм Мерсенна Твистера.

http://en.wikipedia.org/wiki/Mersenne_twister

В нем хорошее сочетание скорости и случайности, а также реализация GPL.

-1
ответ дан 24 November 2019 в 17:48
поделиться

Хорошо с учетом простоты и скорость в качестве вашего основного критерия, вы можете добавить небольшой универсальный помощник вроде этого: -

  // C++ rand generates random numbers between 0 and RAND_MAX. This is quite a big range
  // Normally one would want the generated random number within a range to be really
  // useful. So the arguments have default values which can be overridden by the caller
  int nextRandomNum(int low = 0, int high = 100) const {
    int range = (high - low) + 1;
    // this modulo operation does not generate a truly uniformly distributed random number
    // in the span (since in most cases lower numbers are slightly more likely), 
    // but it is generally a good approximation for short spans. Use it if essential
    //int res = ( std::rand() % high + low );
    int res = low + static_cast<int>( ( range * std::rand() / ( RAND_MAX + 1.0) ) );
    return res;
  }

Генерация случайных чисел - хорошо изученная, сложная и продвинутая тема. Здесь вы можете найти несколько простых, но полезных алгоритмов, помимо упомянутых в других ответах:

5
ответ дан 24 November 2019 в 17:48
поделиться

Учитывая простоту и скорость в качестве ваших основных критериев, вы можете добавить небольшой универсальный помощник, например: -

  // C++ rand generates random numbers between 0 and RAND_MAX. This is quite a big range
  // Normally one would want the generated random number within a range to be really
  // useful. So the arguments have default values which can be overridden by the caller
  int nextRandomNum(int low = 0, int high = 100) const {
    int range = (high - low) + 1;
    // this modulo operation does not generate a truly uniformly distributed random number
    // in the span (since in most cases lower numbers are slightly more likely), 
    // but it is generally a good approximation for short spans. Use it if essential
    //int res = ( std::rand() % high + low );
    int res = low + static_cast<int>( ( range * std::rand() / ( RAND_MAX + 1.0) ) );
    return res;
  }

Генерация случайных чисел - хорошо изученная, сложная и продвинутая тема. Здесь вы можете найти несколько простых, но полезных алгоритмов, помимо упомянутых в других ответах: -

Eternal Confuzzled

0
ответ дан 24 November 2019 в 17:48
поделиться
double randDouble()
{
  double out;
  out = (double)rand()/(RAND_MAX + 1); //each iteration produces a number in [0, 1)
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;
  out = (rand() + out)/RAND_MAX;

  return out;
}

Не так быстро, как double X = ((double) rand () / (double) RAND_MAX); , но с лучшим распределением. Этот алгоритм дает только RAND_MAX равномерно распределенный выбор возвращаемых значений; это дает RANDMAX ^ 6, поэтому его распределение ограничено только точностью double.

Если вам нужен длинный дубль, просто добавьте несколько итераций. Если вам нужно число в [0, 1], а не в [0, 1), просто сделайте строку 4 такой, как out = (double) rand () / (RAND_MAX); .

-2
ответ дан 24 November 2019 в 17:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: