Jak klikne IDE na Debug to wywala błąd, a na Release nie

0

Mam taką funkcję:


int zwrocLiczbeLosowa(int a, int b)
{
	std::random_device dev;
	std::mt19937 rng(dev());
	std::uniform_int_distribution<std::mt19937::result_type> dist(a, b);

	return dist(rng);
}

I w pliku głównym pętle co wywołuje i wypisuje te liczby. - a podaje jako -10, a b jako 10 i losuje w tym przedziale

Jak ten program co w nim pisze kod (chyba IDE to się w skrócie nazywa) ma takie pole ustawione na RELEASE to się kompile bez problemu, losuje i wypisuje.
Ale jak miałam ustawione na DEBUG to wyrzucało błędy !?!?

OBRAZ.png

Dlaczego.... się ta dzieje...
Proszę o pomoc, przestawiałam na te RELEASE bo mi kolega to pokazał, ale nie wiem co to robi, ale zawsze robiłam wszystko na Debug i teraz wolałambym na to wrócić ale nie mogę, bo mam błąd jak na obrazku

2

Pokaż cały kod, bo pokazałaś kod poprawny (choć bezsensownie reinicjalizujący prng), a nie przyczynę problemu.

BTW: uniform int distribution też specjalizuj po typie int, skoro zwracasz int

0
#include <iostream>
#include <random>

int zwrocLiczbeLosowa(int a, int b)
{
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_int_distribution<std::mt19937::result_type> dist(a, b);

    return dist(rng);
}


int main() {
    std::cout << "Wylosuj 10000 liczb w przedziale od <-10 do 10>:\n";
    for (int i = 0; i < 10000; i++) {
        std::cout << zwrocLiczbeLosowa(-10, 10) << std::endl;
    }
    return 0;
}

Działa dla tego Release, a dla Debug jest ten błąd co wyżej.

1
std::uniform_int_distribution<> dist(a, b);

lub

std::uniform_int_distribution<short> dist(a, b);
3

Oj, jednak dałaś dobry kod :​) (tylko brakowało wywołania)

std::uniform_int_distribution<std::mt19937::result_type> dist(a, b);

To jest odpowiednik
std::uniform_int_distribution<std::uint64_t> dist(a, b);
wobec tego oczekuje argumentów tego typu. Jeśli takie nie są, a da się je przekonwertować niejawnie to zostanie to uczynione.

  • 10 to 10, tu jest ok
  • -10 to 18446744073709551606 (264-10)

Wobec tego próbujesz losować pomiędzy 18446744073709551606 a 10 (zauważ, że kolejność jest tu pomylona). W wersji DEBUG kompilator i biblioteka standardowa wstawiają asserty, które tego typu błędy wyłapują.

Rozwiązanie: stosuj się do sugestii z mojego pierwszego posta:

  • std::uniform_int_distribution<int> dist(a, b);, lub
  • std::uniform_int_distribution<> dist(a, b);, lub
  • std::uniform_int_distribution dist(a, b);, lub

Dodatkowo: random_device użyj tylko raz, a nie przy każdym losowaniu - to mija się z celem. Przykład ode mnie z bloga:

thread_local std::mt19937 gen{std::random_device{}()};
 
template<typename T>
T random(T min, T max) {
    using dist = std::conditional_t<
        std::is_integral<T>::value,
        std::uniform_int_distribution<T>,
        std::uniform_real_distribution<T>
    >;
    return dist{min, max}(gen);
}
0

Dziękuję bardzo za odpowiedzi, teraz działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1