繁体   English   中英

正确使用rand()?

[英]Proper use of rand()?

因此,此方法的想法是,它接收main中的9x9数组,并在行之间交换。 它只能将1-3行与1-3交换,将4-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;
}

调用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM