Как рандомизировать int определенное количество раз, работая в том же массиве в C ++? - PullRequest
0 голосов
/ 07 февраля 2020

Итак, я получил задание на c ++, в котором вы, как игрок, перемещаетесь по случайно сгенерированным локациям. Общее количество локаций составляет 27, и движение выполняется броском игральных костей (например, вы находитесь в локации 2 и получаете 6 на кости, вы перемещаетесь в локацию 8). И было бы три типа местоположений, случайно назначенных для места в начале игры (местоположение 1 - тип 1, местоположение 2 - тип 3 и т. Д.). И при инициализации вам нужно получить ровно 14 местоположений типа 1, 5 местоположений типа 2, а остальные - типа 3. Вот что я придумал:

#include <string>
#include <iostream>
#include <stdio.h>      
#include <stdlib.h>     
#include <time.h> 
using namespace std;

// movement and display

string field[28][28];
int moveVal;
int count2;
int count1;

// *** C L A S S E S ***

class location {

};

class monster {
public:
    int health;
};

class player
{
public:
    int playerPosition = 0;
};


// *** F U N C T I O N S ***

void gameInit(player &Knight)
{
    int loc1 = 0;
    int loc2 = 0;
    int loc3 = 0;
    int maxVal = 3;
    int minVal = 1;

    Knight.playerPosition = 0;


    string locStringVal;


    for (int a = 0; a < 28; a++)
    {

        int locVal = 0;

        locVal = minVal + rand() % maxVal;

        cout << locVal << endl;

        if (locVal == 1)
        {
            loc1 += 1;
        }

        if (locVal == 3)
        {
            loc2 += 1;
        }

        if (locVal == 2)
        {
            loc3 += 1;
        }

        if (loc1 > 14)
        {
            minVal = 2;
        }
        if (loc2 > 5)
        {
            maxVal = 2;
        }

    }

}


// Generates random number to move the player and stores the position of the player
void randNum(player &Knight)
{

    srand(time(NULL));

    moveVal = rand() % 6 + 1;

    Knight.playerPosition += moveVal;


}

void display(player &Knight,int &count2, int &count1)
{

    for (count2 = 0; count2 < 28; count2++)
    {
        field[0][count2] = "*";


    }

    field[0][27] = "B";
    if (Knight.playerPosition > 27)
    {
        Knight.playerPosition = 27;
    }
    field[0][Knight.playerPosition] = "P";


    for (count1 = 0; count1 < 28; count1++)
    {
        cout << field[0][count1] << " ";
    }

}



void gameLoop(player &Knight)
{
    char hui;
    bool pidaras = true;

    gameInit(Knight);

    while(pidaras == true)
    {

        randNum(Knight);

        display(Knight, count1, count2);

        cin >> hui;
    }
}


int main()
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
{
    srand(time(NULL));
    player Knight;

    gameLoop(Knight);

}

Сценарий что я придумал работы, но иногда он генерирует слишком много «2» и портит весь код. Если вы запустите его, вы увидите сгенерированные числа.

1 Ответ

0 голосов
/ 07 февраля 2020

Я считаю, что фундаментальная проблема здесь в том, что вы звоните srand каждый раз, когда хотите создать случайное число.

srand задает ваш случайный ряд, а rand выбирает один номер этого ряда. Реализация classi c rand не самая лучшая, но она должна генерировать достаточно сбалансированный ряд.

Проблема в том, что вы не выбираете номера этого вида сбалансированных рядов, вы выбираете первый номер снова и снова разных серий. Таким образом, у вас нет гарантий сбалансированного распределения.

Используйте srand () один раз, rand () many.

Позвольте мне также предложить подход C ++ 11.

#include <rand>

Во-первых, вы можете создать генератор случайных чисел с начальным числом.

std::mt19937 rand_gen(time(0));

Затем вы создадите заданное распределение.

std::uniform_int_distribution<uint32_t> series_1_6(1,6);

И затем наконец вы можете получить свой номер.

std::cout << series_1_6(rand_gen) << std::endl;

Здесь у вас есть несколько хороших ссылок:

Генерация случайных чисел в C ++ 11: как генерировать, как это работает?

Как сгенерировать случайное число в C ++?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...