LINUX.ORG.RU

[c++][random]нецелые числа

 ,


0

1

как реализовать заполнение рандомными НЕЦЕЛЫМИ числами? можно конечно генерить целые и делить на 10(100, 1000, и т.д), делать сдвиг или генерить целую и дробную часть отдельно... есть нормальная метода?


Про рациональные дроби слышал?

ugoday ★★★★★
()

есть нормальная метода?

Чем описанный метод не нормальный? Если хочется извращений, то можно посмотреть в сторону Boost.Random или C++11.

reader
()
#include <stdio.h>
#include <stdint.h>  
#include <stdlib.h>
#include <time.h>

int main()
{
    union {
        int32_t _int;
        float   _float;
    } u;
    srand ( time(NULL) );
    for (int i = 0; i < 10; i++) {
        u._int = rand();
        printf("%e\n", u._float); 
    }
}
dismal_faun ★★
()

Mercenne Twisters.

libDSFMT.

Быстро и много. Период 10 в 600 с копейками или больше.

oami ★★
()

int val = rand (); float fval = *((float *)&val);

note173 ★★★★★
()

спасибо огромное всем, вы все помогли очень!

abyz
() автор топика
Ответ на: комментарий от dismal_faun

Легким движением руки равномерное распределение превращается ... в тыкву.

reader
()

Распределение какое нужно? Тот бред что предлагают с enum и рекастовкой дают нелинейное распределение. Если нужно обычное линейное

делить на 10(100, 1000, и т.д)

это единственный нормальный метод.

slovazap ★★★★★
()
Ответ на: комментарий от Eddy_Em

джедаи манов не читают до тех пор пока не сегфолтится или памать не утекает в глубокий своп :3

dismal_faun ★★
()
Ответ на: комментарий от Eddy_Em

я прочитал ман, но мне к сожалению надо, чтоб оно компилилось в студии тоже, требования тут такие неприятные..

abyz
() автор топика

Алгоритм известный со времен советских калькуляторов: Xn+1 = frac(11 * Xn + Pi), где frac это выделение дробной части.

anonymous
()

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

trex6 ★★★★★
()

Use any random generator library, or any Block Cipher (BC):

#include <algorithm>

void RandNormFrac(float &f, BC &bc)
{
    long a;
    long b;

    bc.gengamma(&a, sizeof(a));
    bc.gengamma(&b, sizeof(b));

    if(a>b) std::swap(a,b); //Norm

    float A = a;
    float B = b;

    f = A / B;
}

And overload for double with «long long» types.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.