2015-12-10 7 views
6

Как бы вы создали функцию, которая генерирует случайное число от 1 до 25 миллионов?C++ Случайное число от 1 до очень большого числа (например, 25 миллионов)

Я думал об использовании rand(), но я прав, думая, что максимальное число, RAND_MAX is = 32000 (там примерно)?

Есть ли способ обойти это, что не уменьшает вероятность выбора очень низких чисел и не увеличивает вероятность выбора высоких/средних чисел?

Редактировать: метод @Jamey D работает отлично независимо от Qt.

+4

Вы можете использовать утилиты в [ ' '] (http://en.cppreference.com/w/cpp/header/random), чтобы сделать это. – NathanOliver

+0

['' 'RAND_MAX'''] (http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX) зависит от реализации. Гарантируется, что это значение не меньше '' '32767'''. – mepcotterell

+0

@ Натан, который должен быть ответом –

ответ

10

Вы можете (должны) использовать новый C++ 11 std::uniform_real_distribution

#include <random> 

std::random_device rd; 
std::mt19937 gen(rd()); 

std::uniform_real_distribution<> distribution(1, 25000000); 

//generating a random integer: 
double random = distribution(gen); 
+0

C++ 11 не стареет на этом сайте, но все же новый :) – LogicStuff

+0

@LogicStuff По сравнению со временем, когда C++ был вокруг, я бы сказал, что он все еще довольно новый: P –

+1

C++ 11 принял эти конкретные библиотеки от повышения поэтому это доступно в boost, даже если вы используете реализацию. –

1

Посмотрите RAN3

http://www.codeforge.com/read/33054/ran3.cpp__html

Вы должны быть в состоянии получить то, что вы хотите от него.

Ran3 (по крайней мере, когда я все еще занимался вычислительным моделированием) быстрее, чем rand() с более равномерным распределением, хотя это было несколько лет назад. Он возвращает случайное целочисленное значение.

Например, получить исходный код из приведенной выше ссылке:

int main() { 
    srand(time(null)); 

    int randomNumber = ran3(rand()) % 25000000; 
    int nextRandomNumber = ran3(randomNumber); 
} 
+2

Хотя это теоретически может ответить на вопрос, [было бы желательно] (// meta.stackoverflow.com/q/8259) включить важные части ответа здесь, и укажите ссылку для справки. – NathanOliver

+1

Да, я собирался у редактирования, ожидая компиляции кода. Это сейчас.Вероятно, вы порекомендовали бы ответ C++ 11 по той, которую я дал, если вам действительно нужны хорошие случайные числа. – Ajwhiteway

+1

Обычно вы не можете использовать модульную операцию для масштабирования интервала генерации случайных чисел. Результирующее распределение становится неоднородным. –