正确使用rand()?

时间:2016-01-26 02:28:16

标签: c++ random

所以这个想法是它在主要的9x9阵列中接收,并在行周围交换。它只能交换1-3行1-3,3-6与4-6和7-9交换7-9。出于某种原因,每隔一段时间,它会从4-6换掉一个,从7-9换掉一个,有时候它会给我7-9行之一的绝对垃圾。我花了2个小时的大部分时间试图找出在这种情况下使用rand()的正确方法,我确信我没有正确地做到这一点。有什么想法吗?

#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;

void printSudoku(int square[9][9]) // Prints out the 9x9 array
{
    for(int i = 0; i < 9; i++)
    {
        for(int j = 0; j < 9; j++)
        {
            cout << square[i][j];
        }
        cout << endl;
    }
}

void swapRows(int square[9][9]) // Randomly generates numbers, within bounds, and swaps those rows with each other
{
    int temp[1][9];
    srand(time(NULL));
    int n = (rand() % 2) + 0;
    int m = (rand() % 2) + 0;
    for(int i = 0; i < 9; i++)
    {
        temp[0][i] = square[n][i];
    }
    for(int j = 0; j < 9; j++)
    {
        square[n][j] = square[m][j];
    }
    for(int k = 0; k < 9; k++)
    {
        square[m][k] = temp[0][k];
    }
    int a = (rand() % 5) + 3;
    int b = (rand() % 5) + 3;
    for(int i = 0; i < 9; i++)
    {
        temp[0][i] = square[a][i];
    }
    for(int j = 0; j < 9; j++)
    {
        square[a][j] = square[b][j];
    }
    for(int k = 0; k < 9; k++)
    {
        square[b][k] = temp[0][k];
    }
    int c = (rand() % 8) + 6;
    int d = (rand() % 8) + 6;
    for(int i = 0; i < 9; i++)
    {
        temp[0][i] = square[c][i];
    }
    for(int j = 0; j < 9; j++)
    {
        square[c][j] = square[d][j];
    }
    for(int k = 0; k < 9; k++)
    {
        square[d][k] = temp[0][k];
    }
}


int main() {
int square[9][9] = {1,2,3,4,5,6,7,8,9,
                    4,5,6,7,8,9,1,2,3,
                    7,8,9,1,2,3,4,5,6,
                    2,3,4,5,6,7,8,9,1,
                    5,6,7,8,9,1,2,3,4,
                    8,9,1,2,3,4,5,6,7,
                    3,4,5,6,7,8,9,1,2,
                    6,7,8,9,1,2,3,4,5,
                    9,1,2,3,4,5,6,7,8,};
printSudoku(square);
swapRows(square);
cout << endl;
printSudoku(square);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

当您致电rand()时,它会为您提供0到RAND_MAX之间的数字。当您使用类似rand() % 8的内容时,它会为您提供0到7之间的随机数。这比您希望随机数跨越的范围更大。您只希望随机数为0到2(0,1或2),然后为第一行添加偏移量。

例如,(rand() % 8) + 6为您提供0 + 6 = 6到7 + 6 = 13的随机数。相反,使用(rand() % 3) + 6给你0 + 6 = 6到2 + 6 = 8.