• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ losowanie liczb z przedziału (-1;1)

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
2,844 wizyt
pytanie zadane 16 lutego 2016 w C i C++ przez Bobek Nowicjusz (150 p.)
Cześć,potrzebuję kodu, który wylosuje liczby rzeczywiste z przedziału otwartego (-1;1). Daję sobie radę z przedziału zamkniętego a tego nie potrafię dobrze ugryźć, Proszę o pomoc i z góry dziękuję.

4 odpowiedzi

+2 głosów
odpowiedź 16 lutego 2016 przez Radfler VIP (101,030 p.)
edycja 17 lutego 2016 przez Radfler
 
Najlepsza

Ale moment? Do generowania liczb używasz std::rand czy <random>?

#EDIT Jakby ktoś kiedyś potrzebował to wymyśliłem rozwiązanie do losowania liczby x, takiej że:

Implementacja:

double random() {
 
    constexpr double EPSILON = std::numeric_limits<double>::epsilon();
 
    const double RANDOM = std::rand();
 
    const double STAGE_1 = ((2.0 * RANDOM) / RAND_MAX) - 1.0;
    const double STAGE_2 = STAGE_1 - std::copysign(EPSILON, STAGE_1);
 
    return STAGE_2;
 
}

I jeszcze test: http://pastebin.com/r6d7Zpub

W razie wątpliwości proszę pytać.

komentarz 16 lutego 2016 przez Bobek Nowicjusz (150 p.)
rand(), czy coś takiego będzie teoretycznie okej? tab[i][j]=rand()%199-99; po czym dzielę element na 100?
komentarz 16 lutego 2016 przez Radfler VIP (101,030 p.)

Tak też możesz ale będzie słabe przybliżenie, tj. zakres będzie z przedziału <-0.99, 0.99>. Póki co wymyśliłem coś takiego:

const double RAND = std::rand();

return ((2 * RAND) / RAND_MAX) - 1;

Tylko w tym wypadku rezultat jest z zakresu <-1.0, 1.0>.

komentarz 16 lutego 2016 przez Radfler VIP (101,030 p.)
przywrócone 17 lutego 2016 przez Radfler

Udało mi się zmienić trochę zakres z <-1.0, 1.0> na <-1.0, 1.0):

const double RAND = std::rand();
const double EPSILON = std::numeric_limits<double>::epsilon();

return ((2 * RAND) / RAND_MAX) - 1 - EPSILON;

Kminię teraz nad (-1.0, 1.0) :D

komentarz 17 lutego 2016 przez Radfler VIP (101,030 p.)
Dobra, edytowałem. Wymyśliłem rozwiązanie.
komentarz 17 lutego 2016 przez draghan VIP (106,230 p.)
Widziałeś odpowiedź Miko? :P
komentarz 17 lutego 2016 przez Radfler VIP (101,030 p.)
Eee tam, zbyt proste :P
+2 głosów
odpowiedź 16 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
Komputery to maszyny skończone - musisz określić jakieś zaokrąglenia, które będą krańcami przedziału, np. -0,999 i 0,999.
+1 głos
odpowiedź 16 lutego 2016 przez Miko Obywatel (1,480 p.)
Zrób to co robisz, przedział zamknięty, a jeśli trafi się 1, albo -1 to odrzuć if'em :P
komentarz 17 lutego 2016 przez draghan VIP (106,230 p.)
I to jest prawidłowa i najprostsza odpowiedź na postawione pytanie. :)
0 głosów
odpowiedź 17 lutego 2016 przez adambalski1 Obywatel (1,010 p.)
Losowanie 1-3, a później odejmij 2.

Podobne pytania

0 głosów
1 odpowiedź 2,527 wizyt
0 głosów
1 odpowiedź 3,294 wizyt
0 głosów
4 odpowiedzi 10,614 wizyt
pytanie zadane 8 listopada 2015 w C i C++ przez Kestrel Początkujący (300 p.)

93,103 zapytań

142,077 odpowiedzi

321,570 komentarzy

62,445 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...