Hoe genereer ik een willekeurig getal tussen twee variabelen die ik heb opgeslagen?

Mogelijk duplicaat:
Willekeurig geheel getal genereren uit een bereik

Ik probeer een programma te maken waarbij de computer een getal raadt dat de gebruiker in zijn/haar hoofd heeft. De enige gebruikersinvoer die vereist is, is of de schatting te hoog, te laag of correct was. Ik heb een probleem met het genereren van een willekeurig getal tussen twee variabelen die de min en max opslaan op basis van eerdere gissingen. Hier is mijn code:

   #include <iostream>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    int main()
    {
        srand(static_cast <unsigned int> (time(0)));
        int compGuess = rand() % 100 +1; //Generates number between 1 - 100
        int highestNumber = 100;
        int lowestNumber = 1;
        char ready;
        char highLowSuccess;
        bool success;
        int tries = 0;
        cout << "Please pick a number between 1 - 100. I will guess your number. Don't tell me what it is!\n\n";
        do
        {
            cout << "Are you ready? (y/n)\n\n";
            cin >> ready;
            if (ready == 'y')
            {
                do
                {
                    cout << "Is your number " << compGuess << "?\n\n";
                    cout << "High, Low or Success?";
                    ++tries;
                    cin >> highLowSuccess; //User input telling the computer whether its too high, too low, or a success
                    if (highLowSuccess == 'h') //Executes code if number guessed was too high.
                    {
                        highestNumber = compGuess - 1; //Stores variable indicating the highest possible number based on user input
                        compGuess = rand() % highestNumber +1; //Generates a new random number between 1 and the new highest possible number
                        success = false;
                    }
                    else if (highLowSuccess == 'l') //Executes code if number guessed was too low.
                    {
                        lowestNumber = compGuess + 1;//Stores variable indicating the lowest possible number based on user input
                        compGuess = (rand() % highestNumber - lowestNumber + 1) + lowestNumber // <---- Not producing the desired result
                        success = false;
                    }
                    else if (highLowSuccess == 's') //Executes code if the computer's guess was correct.
                    {
                        cout << "I guessed your number! It only took me " << tries << " tries!";
                        success = true;
                    }
                } while (success != true);
            }
            else
            {
             continue;
            }
       } while (ready != 'y');
    return 0;
    }

de hoogste numbum is wat de max zou moeten zijn en het laagstnumber is wat de min zou moeten zijn. Ik heb een vergelijking nodig die me een willekeurig getal kan genereren terwijl je rekening houdt met de hoogste en laagste mogelijke getallen.

Vergeef me als het antwoord echt eenvoudig is, ik ben een noob-programmeur. xD


Antwoord 1, Autoriteit 100%

Gebruik:

om een ​​willekeurig getal tussen Min en Max te genereren,

int randNum = rand()%(max-min + 1) + min;

(inclusief max en min)


Antwoord 2, Autoriteit 55%

Heel snel, heel gemakkelijk:

srand(time(NULL)); // Seed the time
int finalNum = rand()%(max-min+1)+min; // Generate the number, assign to variable.

En dat is het. Dit is echter bevooroordeeld naar de onderkant, maar als u C++ TR1/C++11 gebruikt je kunt het doen met behulp van de random-header om die vooringenomenheid als volgt te voorkomen:

#include <random>
std::mt19937 rng(seed);
std::uniform_int_distribution<int> gen(min, max); // uniform, unbiased
int r = gen(rng);

Maar je kunt de bias in normale C++ ook als volgt verwijderen:

int rangeRandomAlg2 (int min, int max){
    int n = max - min + 1;
    int remainder = RAND_MAX % n;
    int x;
    do{
        x = rand();
    }while (x >= RAND_MAX - remainder);
    return min + x % n;
}

en dat is verkregen van dit bericht.


Antwoord 3, autoriteit 38%

Als je een C++11-compiler hebt, kun je je voorbereiden op de toekomst door de pseudo-willekeurige getalfuncties van c++ te gebruiken:

//make sure to include the random number generators and such
#include <random>
//the random device that will seed the generator
std::random_device seeder;
//then make a mersenne twister engine
std::mt19937 engine(seeder());
//then the easy part... the distribution
std::uniform_int_distribution<int> dist(min, max);
//then just generate the integer like this:
int compGuess = dist(engine);

Dat is misschien iets gemakkelijker om te begrijpen, als u niet iets hoeft te doen met Modulos en Crap … Hoewel het meer code vereist, is het altijd leuk om een aantal nieuwe C++ dingen te kennen …

Ik hoop dat dit helpt
– Luke


Antwoord 4, Autoriteit 11%

rand() % ((highestNumber - lowestNumber) + 1) + lowestNumber

Other episodes