01/10/2018, 00:30
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
Bài liên quan
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.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.
Mình sửa theo cách của bạn, chạy đc rồi
Dựa theo cái này mình sẽ làm bản 9x9. Cảm ơn bạn nhiều.