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

Jak napisać funkcję losującą liczbę z przedziału?
W1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
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).

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 316
0
Kopiuj
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

W1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Takie coś miałem:

Kopiuj
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:

Kopiuj
return distribution(generator);

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

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 316
0
Kopiuj
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.

YooSy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 472
Hodor
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 337
0

@watus1992r: Coś takiego?

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

Kopiuj
#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ę:

Kopiuj
#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.:

Kopiuj
#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>
}
W1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
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:
Kopiuj
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".

Hodor
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 337
0

@watus1992r

Kopiuj
#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());
}
YooSy
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 472
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ą.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.