Tôi đang cố gắng tạo 10 số ngẫu nhiên duy nhất trong C. Tôi có một mảng chứa 10 số số lượng[]
, nhưng điều này sẽ "phân tách" sau một thời gian.
Mã là:
int i,j,numout[10],randnum;
khoảng trống chính()
{
srand(thời gian(NULL));
cho(i=0;i<10;i++)
{
numout[i]=generate();
printf("%d",numout[i]);
fflush(stdout);
ngủ(1);
printf("\b");
}
}
int tạo()
{
randnum=1+(int)(Rand()*mul_val/(RAND_MAX+1.0));
for(j=0;j<>
{
if(randnum==0 || randnum==numout[j])
{
randnum=generate();
}
}
trở lại(Randnum);
}
Nghiêm túc vứt bỏ mã đó. Bạn cần một thuật toán xáo trộn chứ không phải một đoạn mã kiểm tra xem các giá trị cũ có trùng lặp hay không. Khi nguồn dự trữ của bạn cạn kiệt, việc thực hiện mọi việc theo cách của bạn sẽ ngày càng mất nhiều thời gian hơn. Ưu điểm của thuật toán xáo trộn là nó không bị suy giảm khi nhóm ngày càng nhỏ hơn.
Đây là một đoạn mã tôi sử dụng để trả lời các câu hỏi khác nhau. Nó duy trì một danh sách các số và khi trả về một số ngẫu nhiên cho bạn, nó sẽ xóa số đó khỏi danh sách và giảm số lượng cho số được chọn ngẫu nhiên tiếp theo.
#include
#include
#define ERR_NO_NUM -1
#define ERR_NO_MEM -2
int myRandom (kích thước int) {
int tôi, n;
int tĩnhNums = 0;
int tĩnh *numArr = NULL;
// Khởi tạo với kích thước cụ thể.
nếu (kích thước >= 0) {
nếu (numArr != NULL)
miễn phí(numArr);
if ((numArr = malloc (sizeof(int) * size)) == NULL)
trả về ERR_NO_MEM;
cho (i = 0; i < kích thước; i++)
numArr[i] = i;
numNums = kích thước;
}
// Lỗi nếu không còn số nào trong nhóm.
nếu (numNums == 0)
trả về ERR_NO_NUM;
// Lấy số ngẫu nhiên từ nhóm và xóa nó (rnd trong phần này
// case trả về một số từ 0 đến bao gồm numNums-1).
n = rand() % numNums;
i = numArr[n];
numArr[n] = numArr[numNums-1];
numNums--;
nếu (numNums == 0) {
miễn phí(numArr);
numArr = 0;
}
trả lại tôi;
}
int chính (void) {
int i;
srand (thời gian (NULL));
i = myRandom (20);
trong khi (i >= 0) {
printf ("Số = %3d\n", i);
i = myRandom (-1);
}
printf ("Cuối cùng = %3d\n", i);
return 0;
}
Đầu ra mẫu cho thấy điều này đang hoạt động:
Số=19
Số=10
Số=2
Số=15
Số = 0
Số=6
Số=1
Số=3
Số=17
Số=14
Số=12
Số=18
Số=4
Số=9
Số=7
Số = 8
Số=16
Số=5
Số=11
Số=13
Cuối cùng=-1
Gọi nó với kích thước nhóm không âm và nó đặt một chuỗi mới và trả về giá trị ngẫu nhiên đầu tiên. Sau đó bạn có thể sử dụng -1
Gọi nó và nó sẽ nhận được số duy nhất ngẫu nhiên tiếp theo từ nhóm. Khi hồ cạn kiệt, nó sẽ trả về -1.
câu trả lời khácPhiên bản chứa mã này cũng có thể duy trì nhiều nhóm nếu bạn muốn có thể sử dụng tính năng này trong mã luồng.
Tôi là một lập trình viên xuất sắc, rất giỏi!