Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Losowanie liczb rzeczywistych.

Ostatnio zmodyfikowano 2015-12-27 12:25
Autor Wiadomość
LordShadow47
Temat założony przez niniejszego użytkownika
Losowanie liczb rzeczywistych.
» 2015-12-26 13:08:19
Wiatam. Potrzebuję różnych kombinacji funkcji losującej liczby rzeczywiste. W sieci nie znalazłem tego czego szukałem. Np. jak wylosować liczby z przedziału od <-212 do 345> itp. funkcja wygląda jakoś tak: a=(rand()/RAND_MAX). Tylko proszę bez udziwnień w postaci dziwacznych funkcji nie wiadomo skąd. Wszystko zawiera się podstawowych bibliotekach <stdio.h>,<stdlib.h>,<time.h>
P-142372
Monika90
» 2015-12-26 13:13:45
<stdio.h>,<stdlib.h>,<time.h>
Nie żyjesz w latach siedemdziesiątych, użyj C++.
P-142373
Gibas11
» 2015-12-26 13:31:15
Nawet math.h nie można użyć? Byłoby prościej. :\ Tak czy inaczej całość to niecałe 20 linii kodu, proszę:
C/C++
int tenPow( unsigned int n )
{
    int base = 10;
    int res = 1.0;
    while( n > 0 )
    {
        if( n & 1 )
             res *= base;
       
        base *= base;
        n >>= 1;
    }
    return res;
}
inline float randomFloat( int _from, int _to, int n )
{
    return static_cast < float >(( rand() %(( _to - _from ) * tenPow( n ) ) ) +( _from * tenPow( n ) ) ) / tenPow( n );
}
1. Pierwsza funkcja jest do wyliczenia n-tej potęgi 10, oparte na algorytmie znalezionym tu http://4programmers.net​/Algorytmy​/Szybkie_Pot%C4%99gowanie, nie będę zagłębiał się w szczegóły, pamiętaj tylko że wygodniej byłoby użyć pow(10, n) z math.h.
2. Druga funkcja to właściwy kod o który ci chodziło, całość sprowadza się do wylosowania liczby z zakresu od "min * 10 ^ n" od "max * 10 ^ n" (min i max to zakres docelowy a n ilość liczb po przecinku) i podzielenia całości przez "10 ^ n". Prosty przykład, chcemy liczbę z zakresu 2 - 3 z dokładnością do 2 cyfr po przecinku, program losuje z 200 - 300, daje np. 273, dzieli przez 100 i w efekcie dostajemy 2.73.
P-142374
carlosmay
» 2015-12-26 19:39:26
<random>
oraz
C/C++
std::uniform_real_distribution < double > dist( min, maks ); // ustawia losowanie liczb rzeczywistych z zakresu od min do maks
 
Tylko proszę bez udziwnień w postaci dziwacznych funkcji nie wiadomo skąd.
 Jeśli <random> to funkcja nie wiadomo skąd to stary sposób:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    //<-212 do 345>
    int min = - 212;
    int max = 345;
    srand( time( NULL ) );
    double a = static_cast < double >( rand() %( max - min ) - 212 );
    double b = static_cast < double >(( rand() % 1000 + 1 ) / 1000.0 );
    cout << a + b << endl;
}
P-142392
LordShadow47
Temat założony przez niniejszego użytkownika
» 2015-12-26 23:54:21
Wiem że mógłbym użyć C++, ale potrzebuje tego w C, i ma to być napisane za pomocą funkcji rand() pamiętam że było coś z RAND_MAX ale nie wiem jak to napisać żeby losowało z danego przedziału.
P-142398
carlosmay
» 2015-12-27 02:03:13
ma to być napisane za pomocą funkcji rand() pamiętam że było coś z RAND_MAX
 Funkcja rand() losuje wartość liczbową z przedziału od 0 do RAND_MAX,
a uzyskanie oczekiwanej wartości to już tylko kwestia operacji matematycznych na zwróconej wartości z funkcji rand() .

Rozwiązanie problemu już padło, a to jakie działania mają być wykonane na zwróconej wartości zależy od autora kodu.


P-142400
Gibas11
» 2015-12-27 12:25:49
Chodzi Ci chyba o to:
C/C++
int main()
{
    srand( time( NULL ) );
   
    float srednia = 0.f;
    for( int i = 0; i < 512; i++ )
         srednia +=( static_cast < float >( rand() ) / RAND_MAX ) * 5;
   
    cout << srednia / 512;
   
    return 0;
}
Działa, po wyjściu tego programu widać, że daje dobre wyniki (średnia prawie równa 2.5), więc możesz tego użyć.

Zależy co dokładnie chcesz osiągnąć, jeżeli jesteś pewny ilości liczb po przecinku użyj tego lub rozwiązania od carlosmay a jeżeli oczekujesz uniwersalności to sięgnij po kod z mojego pierwszego posta.

Ps. Macie nie używać bibliotek C++, czy całość zostanie też pod C skompilowana? Jeżeli to drugie to musisz się pozbyć static_cast bo z tego co kojarzę jest to funkcja z C++, zamiast tego daj zwykłe rzutowanie na float
( float ) rand()
, też powinno zadziałać.
P-142406
« 1 »
  Strona 1 z 1