Jak napisać funkcję losującą liczbę z przedziału?

0

Robię grę milionerzy, potrzebuję aby pytania wyświetlały się losowo. Chciałbym, aby w funkcji nad mainem była funkcja losuj, a odwołanie do funkcji w mainie. Mam jeden kod ale on nie działa. Kompiluje ale nie wyświetla wyniku.

Jak powinna wyglądać taka funkcja aby była użyteczna(po wylosowaniu liczby chcę dodać ify dla dla odpowiedniej liczby).

0
int random(int min, int max){
    std::random_device random;  
    std::mt19937 generator(random()); 
    std::uniform_int_distribution<> distribution(min, max);
     return distribution(generator);
}

Pokaż co masz

0

Takie coś miałem:

int losuj()
{
    srand( time( NULL ) );    
    for( int i = 1; i <= 32; i++ )
         printf( "Wylosowano %d\n", rand()%100);
    
}

I teraz jak mam się odwołać do tej twojej funkcji?
Pod:

return distribution(generator);

pod wkleić ify i w ifach odwołania do pytań?
If, jak zmienna?

0
int main(){
std::cout<<random(0, 10);
}

Po co if w funkcji która ma zwrócić losową wartość? Lepiej sobie jakieś warunki sprawdzaj w drugiej funkcji.

0

@watus1992r: Coś takiego?

Jeżeli tylko raz korzystasz z funkcji rand w programie:

#include <iostream>
#include <cstdlib>
#include <ctime>

int MinMaxRandom(int MIN, int MAX)
{
    srand(time(NULL));
    return (std::rand() % (MAX - MIN + 1)) + MIN;
}

int main()
{
    std::cout << MinMaxRandom(10, 50);
}

Jeżeli korzystasz z funkcji kilka razy, to wyrzuć srand(time(NULL)); poza funkcję:

#include <iostream>
#include <cstdlib>
#include <ctime>

int MinMaxRandom(int MIN, int MAX)
{
    return (std::rand() % (MAX - MIN + 1)) + MIN;
}

int main()
{
    srand(time(NULL));
    std::cout << MinMaxRandom(10, 50) << '\n';
    std::cout << MinMaxRandom(20, 53) << '\n';
    std::cout << MinMaxRandom(1, 2) << '\n';
}

Jeżeli chcesz od razu kilka razy wylosować, to np.:

#include <iostream>
#include <cstdlib>
#include <ctime>

int MinMaxRandom_repeated(int MIN, int MAX, int repeat)
{
    int * numbers = new int[repeat];
    for (int i=0; i < repeat; i++)
    {
        numbers[i] = (std::rand() % (MAX - MIN + 1) + MIN);
        std::cout << "numbers[" << i << "] = " << numbers[i] << '\n';
    }
    return numbers[repeat];
}

int main()
{
    srand(time(NULL)); rand();
    MinMaxRandom_repeated(5, 105, 7); // losujesz 7 liczb z przedziału <5; 105>
}
0

Opiszę jak bym chciał zrobić:

  1. Mam funkcję losującą int losuj().
  2. Mam wypisane funkcje z pytaniami nad mainem (void pytanie1(), void pytanie2() itd...).
  3. Mam funkcję int wylosowano() w której znajduje się odwołanie do int losuj() a pod spodem ify np:
int wylosowano(int losowa)
{
int losuj();
if(losowa ==1)
{
void pytanie1();
}
if(losowa ==2)
{
void pytanie2();
}
itd...
}

No i teraz nie wiem co powinno być jako ta "losowa".

0

@watus1992r

#include <iostream>
#include <ctime>
#include <cstdlib>

int losuj()
{
    srand(time(NULL));
    int losowa = std::rand() % 3 + 1;
}
int wylosowano(int losowa)
{
    if (losowa == 1) {
        std::cout << "Losowa == 1";
        // Pytanie1();
    }
    else if (losowa == 2) {
        std::cout << "Losowa == 2";
        // Pytanie2();
    }
    else {
        std::cout << "Losowa == 3";
        // Pytanie3();
    }
}
int main()
{
    wylosowano(losuj());
}
0

Chodzi o niezwracanie wartości z funkcji losuj(), przez co funkcja wylosowano() dostaje przypadkową wartość. UB.
Funkcja wylosowano() też nic nie zwraca pomimo deklaracji zwracania wartości typu int.

No jeszcze jak by zamiast wielu if, zrobić switch case to by było idealnie.

Najrozsądniej trzymać pytania w tablicy struktur i losować indeks,
gdzie struktura będzie zawierać pytania wraz z odpowiedzią.

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