Chọn số random không trùng nhau trong game Sudoku

Như tiêu đề, mình đang vướng chỗ chọn random 6 số từ 1 đến 9, không được trùng nhau để gán vào mảng sodoku. Cách mình đang làm là random chỉ số để lấy phần tử trong mảng arr_num, gán giá trị đó vào mảng sodoku, sau đó xóa luôn phần tử đó. Code:

#include <iostream>
#include <cstdlib>       //rand()
#include <ctime>         //time()
#include <windows.h>     //Sleep()
using namespace std;

int getRandom(){
	srand((int)time(0));
	int num = rand() % 8; //tu 0 den 8
	return num;
}

int main()
{
	int arr_num[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, arr_num_len = 9;
	int sodoku[6], sodoku_index = 0;

	for (; sodoku_index < 6; sodoku_index++){
		//chờ để random số
		cout << "> ";
		Sleep(1000);

		//lấy ngẫu nhiên 1 số từ 0 đến 8 để làm chỉ số random
		int random_index = getRandom();

		//gán giá trị của chỉ số vào mảng sodoku
		sodoku[sodoku_index] = arr_num[random_index];

		//xóa phần tử vừa lấy trong mảng arr_num
		for (int i = random_index; i < arr_num_len - 1; i++){
			arr_num[i] = arr_num[i + 1];
		}
		arr_num_len--;
	}
        //xuất mảng sodoku
	for (int i = 0; i<6; i++){
		cout << sodoku[i] << " ";
	}
	system("pause");
	return 0;
}

Output ra phần tử cuối bị lỗi:
Ví dụ output: 2 3 5 1 6 -84754512

Nhờ các bạn giúp sửa lỗi thuật toán lấy số, hoặc gợi ý thuật toán khác tối ưu hơn. Cảm ơn :smiley:

int num = rand() % 9; mới ra số từ 0 đến 8 chứ, số dư mà, chia cho 8 thì làm sao dư 8 được. :smiley:

với cả lúc random ra thì xoá đi 1 phần tử, thì mảng bị giảm đi 1 phần tử, nên là mình sẽ truyền 1 số n vào hàm getRandom() để lấy ra 1 số ngẫu nhiên từ 0 đến n-1.

int getRandom(int n){
	srand((int)time(0));
	int num = rand() % n; //tu 0 den n - 1
	return num;
}
1 Like

Mình sửa theo cách của bạn, chạy đc rồi :grinning:
Dựa theo cái này mình sẽ làm bản 9x9. Cảm ơn bạn nhiều.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?