2013-09-24 2 views
1

Я надеюсь найти способ заполнить массив случайными числами с плавающей запятой. Мой массив размером 50, и я надеюсь заполнить этот массив случайными числами с плавающей точкой от диапазона 1-25. Вот что я до сих пор. Я очень благодарен за любые советы и ответы, которые могут предложить любой. Спасибо.Как заполнить массив случайными числами с плавающей запятой?

#include <iostream> 

#include <ctime> 

#include <cstdlib> 

using namespace std; 


int main() 

{ 

float myArray[50]; 


for(int i = 1; i <= 25; i++) 

{ 

srand(time(0)); 


myArray[i] = (rand()% 50 + 1); 

cout << myArray[i] << endl; 



system("Pause"); 

return 0; 

} 

} 
+0

Использовать классы из ''. –

+5

Не делайте 'srand' в цикле, время будет таким же, по крайней мере, между некоторыми вызовами. – dasblinkenlight

+0

Вы в настоящее время только наполовину заполняете свой массив - мне нужно подняться до 50, а ваш модуль должен быть 25. –

ответ

3

Если С ++ 11 это не вариант, вы можете просто использовать rand, разделив ее результат на RAND_MAX постоянной литым к float, чтобы получить равномерное распределение поплавками в диапазоне [0, 1]; то вы можете умножить его на 24 и прибавить 1, чтобы получить желаемый диапазон:

myArray[i] = rand()/float(RAND_MAX)*24.f+1.f; 

Кстати, как и другие наблюдаемые, переместить srand из вашего цикла - семя RNG (обычно) должен быть инициализирован только один раз.

(обратите внимание, что деление на RAND_MAX даст распределение, включает правую крайнюю вашего интервала, если вы хотите, чтобы исключить его, вы должны разделить, например, путем RAND_MAX+1)


Конечно, результирующее распределение так же хорошо, как исходное распределение rand() (как в случайности, так и в гранулярности); вы обычно получите LCG и степень детализации не менее ~ 0,0007 (гарантируется стандартом, и то, что фактически предоставляют VC++ и другие компиляторы). Если вам нужны лучшие случайные числа, вы должны следовать советам, опубликованным в других ответах (генератор Twister по умолчанию Mersenne в C++ 11 обеспечивает лучшую случайность и более высокий гарантированный диапазон).

+0

Большое спасибо! Это сработает! – stackexchange12

1
#include <random> 
... 
std::random_device rd; 
std::mt19937 gen(rd()); 
std::uniform_real_distribution<float> dist(1.0f, 25.0f); 

std::cout << dist(gen); 
9

Если C++ 11 варианта Я хотел бы использовать random заголовок и uniform_real_distribution:

#include <iostream> 
#include <random> 

int main() 
{ 
    std::random_device rd; 

    std::mt19937 e2(rd()); 
    std::uniform_real_distribution<> dist(0, 25); 

    for (int n = 0; n < 50; ++n) { 
     std::cout << dist(e2) << ","; 
    } 
    std::cout << std::endl ; 
} 

Why do people say there is modulo bias when using a random number generator? объясняет, почему наивное использование модуля с rand() причинами смещения в распределения и как его избежать.

+0

Большое спасибо за ваш ответ! Я еще не знаком с новыми стандартами C++ 11, но я все еще изучаю старый способ. – stackexchange12

+0

@ stackexchange12 Ваш прием, есть чему поучиться. В долгосрочной перспективе имейте в виду, что использование «случайного» заголовка - правильный путь. –

1

Каждый раз, когда цикл цикла выполняет итерацию, он присваивает одному значению в массиве случайное число. Поскольку ваш массив имеет размер 50, вы хотите итерации 50 раз вместо 25, как сейчас.

for(int i = 0; i < 50; i++) 

Границы массива начинаются с 0, поэтому вы можете получить доступ только от массива [0] к массиву [49].

Чтобы получить случайное число от 1-25, вы хотите

myArray[i] = rand() % 25 + 1; 

Кроме того, вы хотите, целые или с плавающей точкой случайных чисел? Прямо сейчас вы просто получаете целые числа, мешая 1, 2, 3, ... 25. Если вам нужно что-то вроде 2.45, 6.883, 23.999 и т. Д., Вам нужно сделать что-то другое. См. C++ random float number generation для ответа.

Возможно, вы не хотите делать паузу каждый раз, когда вы вставляете число в массив. Переместите это после цикла for.

system("pause"); 

Кроме того, если вы return 0 внутри для цикла, то будет назначить только один номер, прежде чем ваша программа будет выходить.Переместите это и после цикла.

0

Использование uniform_real. В следующей программе генерируются случайные числа с плавающей запятой между 1.0 и 2.0:

#include <random> 
#include <iostream> 

typedef std::ranlux64_base_01 Myeng; 
typedef std::uniform_real<float> Myceng; 
int main() 
{ 
    Myeng eng; 
    Myceng ceng(1.0, 2.0); 
    Myceng::input_type engval = eng(); 

    std::cout << "a random value == " << ceng(eng) << std::endl; 
    std::cout << "a random value == " << ceng(eng) << std::endl; 
    std::cout << "a random value == " << ceng(eng) << std::endl; 

    return (0); 
} 
Смежные вопросы