Проблемы с моим генератором случайных чисел, числа далеко за пределами диапазона - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь сделать генератор головоломок Судоку для школьного проекта, и у меня есть большая часть кодирования и логики c, отработанные для программы, просто генератор случайных чисел, который я использую для присвоения значений к сетке Судоку генерируют числа далеко за пределами соответствующего диапазона, и я не могу понять, почему он не работает должным образом. Вот код для генератора чисел:

int Sudoku::RNG(int range, int start){
    int randNum;
    randNum = (rand()%range+start);
    return randNum;
}

Я также добавил

srand(time(NULL)); 

в самом начале моего основного метода.

И вот код метода, который заполняет сетку Судоку числами из функции RNG ():

void Sudoku::gridPopulate(int grid [9][9]){
    Solution s;
    int num;
    bool safe;
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            do{
                safe = false;
                num= RNG(9,1);
                if(s.rowCheck(grid, i, num)&& s.colCheck(grid, j, num) && s.gridCheck(grid, i, j, num)){
                    grid[i][j] = num;
                    cout << "Number entered into grid" << endl;
                    safe = true;
                }
            }while(safe);
        }
    }

Основной метод:

int main()
{
    //Program Start
    srand(time(NULL));
    int difficulty;
    int choice;
    int grid[9][9];

    cout << "Welcome to my Sudoku puzzle generator! \nTest your mental muscles and see if you can solve the puzzle!" << endl;

    //Puzzle Generator
    Sudoku game;
    game.gridPopulate(grid);
    cout << "board populated"<< endl;
    cout << "Successful board made" << endl;
    game.displayBoard(grid);
}

Пример ошибочной платы Судоку ниже (форматирование выключено, потому что из огромных чисел, просто игнорируйте штрихи и вертикальные линии):

1  5013192 4981028 9 |20064 8 5 |1 2 3 |
2  8 5 4 |1995768265 0 2114351727 |28 7670880 7670908 |
3  1 7274056 7 |3 0 7670880 |4 6 7670880 |
   -----------------4  6 7 2 |4199040 1 8 |7670912 -1196314433 4 |
5  1953657218 1 0 |5 4 32 |7 3 7274140 |
6  5 8 1953722109 |2 9 7670916 |7274116 4199040 4358512 |
   -----------------7  0 1953722297 1 |9 1953787893 3 |7274204 4 8 |
8  1953722109 1953722083 8 |4199040 4199040 0 |9 7274160 2 |
9  3 1953746112 1198757840 |6 7274216 4 |4358512 7274368 4358606 |
   -----------------

   1 2 3 4 5 6 7 8 9

Число, которое он мне дает, иногда очень велико, иногда нет. В настоящий момент меня это озадачивает, любая помощь или совет будут с благодарностью приняты несколько заявлений о поиске неисправностей. Теперь метод будет оставаться на каждом отдельном элементе массива до тех пор, пока он не будет заполнен. Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, что код застревает в операторе do / while, где происходит RNG (). Я использую счетчик, чтобы отследить, сколько итераций ГСЧ проходит, прежде чем передать безопасное значение в сетку. Проблема в том, что ГСЧ проходит слишком много итераций, прежде чем произойдет, чтобы сгенерировать безопасное значение, иногда тысячи итераций, прежде чем двигаться дальше. В какой-то момент он просто застрянет, бесконечно генерируя случайные числа, не имея возможности двигаться дальше. '

   void Sudoku::gridPopulate(int grid [9][9]){
        Solution s;
        int num;

        do{
            for(int i=0;i<9;i++){
                for(int j=0;j<9;j++){
                    int counter = 0;
                    do{
                        srand(time(NULL));
                        num = RNG(9,1);
                        counter++;
                        cout << "RNG attempts: " << counter << endl;
                    }while(!(s.rowCheck(grid, i, num)&& s.colCheck(grid, j, num) && s.gridCheck(grid, i, j, num)));
                grid[i][j]=num;
                cout << grid[i][j] << endl;
                cout << "Row #: " << i << endl;
                cout << "Col #: " << j << endl;
                }//end j loop
                displayBoard(grid);
            }//end i loop
            displayBoard(grid);
        }while(!validityCheck(grid));

Вот и мой метод displayBoard, хотя я не думаю, что он связан с проблемой.

void Sudoku::displayBoard(int grid[9][9]){
    /**********************************************************/
    cout << "   ----------------------" << endl;
    for(int i=0; i<9;i++){
        if(i==0)
            cout << "1  | ";
        if(i==1)
            cout << "2  | ";
        if(i==2)
            cout << "3  | ";
        if(i==3)
            cout << "4  | ";
        if(i==4)
            cout << "5  | ";
        if(i==5)
            cout << "6  | ";
        if(i==6)
            cout << "7  | ";
        if(i==7)
            cout << "8  | ";
        if(i==8)
            cout << "9  | ";
        for(int j=0;j<9;j++){
            cout << grid[i][j] << " ";
            if(j==2)
            cout << "| ";
            if(j==5)
            cout << "| ";
            if(j==8)
            cout << "| ";
        }
        cout << endl;
        if(i==2)
            cout << "   ------------------------" << endl;
        if(i==5)
            cout << "   ------------------------" << endl;
        if(i==8)
            cout << "   ------------------------" << endl;
    }
    cout << "\n";
    cout << "     1 2 3   4 5 6   7 8 9 " << endl;

    /**********************************************************/
}

1 Ответ

0 голосов
/ 15 апреля 2020
Nothing wrong with the RNG function, all we need is debugging skills
## Try this to see what is the immediate value of the grid[i][j] ##
`void Sudoku::void gridPopulate(int grid[9][9]) 
{
        Solution s;
        int num;
        bool safe;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                do {
                    safe = false;
                    num = RNG(9, 1);
                    if (s.rowCheck(grid, i, num) && s.colCheck(grid, j, num) && s.gridCheck(grid, i, j, num)) {
                        grid[i`enter code here`][j] = num;
                        //cout << "Number entered into grid" << endl;
                        safe = true;
                    }
                } while (safe);
                cout << grid[i][j] << " ";
            }
            cout << endl;
        }
    }`
...