Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > генерация чисел с запятой


Автор: Bart_Simpson 8.3.2007, 14:01
Такой вот вопрос кто знает как мне сгенерировать с помощью rand числа с запятой smile 

Код

//ф-ция заполнения матрицы случайным образом
int Rand_Entr(float mx[100][100],int rows,int colms)
{
  int i,j=0;
  //обработка ошибки размер матрицы не введен
  if ((rows<=0) && (colms<=0)){    
                    cout << "\n\tErorr Size not found!\n";
                    getch();
                    }
  for (i=0;i<rows;i++){
    for (j=0;j<colms;j++){
      mx[i][j]=rand() %50;
  }
  }
  return 0;
}


тут я генерирую целые числа а как с запятой smile 

Автор: jonie 8.3.2007, 14:35
можно, я пологаю, использовать датчики псевдослучайных чисел....например равномерно-распределенных
Код

double random(){
    static time_t ltime;
    static int b=time(&ltime);        //начальное значение
    int y = b*1220703125;
    if(y<0){
        y+=1073741824;
        y+=1073741824;
    }
    b=y;
    return y*0.4656613E-9;
}

даст ~50 миллионов разных, равномерно-распределенных на интервале [0,1)   псевдослучайных чисел...
ну или, если хочется, чтобы распределение было по некомузакону, например по нормальному , что даст нормально распределенные числа в интервале [Mt - n/2 * Dt, Mt +n/2 * Dt]
где Mt - мат ожидание, Dt - дисперсия, n - количество чисел...
Код

double norm_datchik(int n, double mt, double dt)
{
    double a=0.0;
    for (int j = 0; j < n; j++)        //n генераций равн.распред СВ
        a+=random();
    return mt+(a-n/2)*dt;
}

ну и  вообще почитать теорию чтоли?)....

Автор: Rencom 8.3.2007, 14:50
обработка ошибок плохая)

  //обработка ошибки размер матрицы не введен
  if ((rows==0) && (colms==0)){   

числа ведь могут и отрицательные придти)) Думаю, лучше сделать так:

  if ((rows <= 0) && (colms <= 0)){


что касается самого заполнения матрицы... можно, конечно же, сделать по законам распределения случайных величин из теории вероятностей, но можно еще проще, используя математические фукнции типа синуса, косинуса, логарифма.....=) Как-нить типа того: log(sin(random())) =)

Автор: Bart_Simpson 8.3.2007, 15:43
Спасибо 
jonie, вот это мне больше подошло 
Код

 double norm_datchik(int n, double mt, double dt)
{
    double a=0.0;
    for (int j = 0; j < n; j++)        //n генераций равн.распред СВ
        a+=random();
    return mt+(a-n/2)*dt;

}

Автор: Bart_Simpson 8.3.2007, 17:27
гуд

Автор: GremlinProg 8.3.2007, 21:44
хм, а чем не нравится обычное деление?
Код

double
    Range      = 100.0,
    RandNum = (Range*rand())/RAND_MAX;

Range - диапазон, в котором нужно число
RandNum - результат

Автор: GremlinProg 8.3.2007, 22:43
простое масштабирование )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)