обратите внимание, что self
мог на самом деле быть любой допустимый идентификатор Python. Например, мы могли столь же легко записать от примера B Chris:
class A(object):
def __init__(foo):
foo.x = 'Hello'
def method_a(bar, foo):
print bar.x + ' ' + foo
и это работало бы точно то же. Однако рекомендуется использовать сам, потому что другой pythoners распознает его более легко.
Старое решение, например:
double X=((double)rand()/(double)RAND_MAX);
Должно соответствовать всем вашим критериям (портативность, стандарт и скорость). очевидно, что сгенерированное случайное число должно быть засеяно, стандартная процедура выглядит примерно так:
srand((unsigned)time(NULL));
Класс random_real из библиотеки случайных ускорений что вам нужно.
Если скорость - ваша главная забота, я бы просто выбрал
double r = (double)rand() / (double)RAND_MAX;
Вы можете попробовать алгоритм Мерсенна Твистера.
http://en.wikipedia.org/wiki/Mersenne_twister
В нем хорошее сочетание скорости и случайности, а также реализация GPL.
Хорошо с учетом простоты и скорость в качестве вашего основного критерия, вы можете добавить небольшой универсальный помощник вроде этого: -
// 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;
}
Генерация случайных чисел - хорошо изученная, сложная и продвинутая тема. Здесь вы можете найти несколько простых, но полезных алгоритмов, помимо упомянутых в других ответах:
Учитывая простоту и скорость в качестве ваших основных критериев, вы можете добавить небольшой универсальный помощник, например: -
// 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;
}
Генерация случайных чисел - хорошо изученная, сложная и продвинутая тема. Здесь вы можете найти несколько простых, но полезных алгоритмов, помимо упомянутых в других ответах: -
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);
.