01/10/2018, 09:44
Hỏi về thuật toán Random
Bác nào có thể chỉ giáo cho e thuật toán đưa ra k số ngẫu nhiên không trùng nhau trong khoảng từ số 1 đến n (k nhỏ hơn hoặc bằng n)không ạ?
vd 7 số 1 2 3 4 5 6 7
k = 3 thì cho ra OUTPUT là: 3 5 6
Bài liên quan
Bạn có thể xem list các thuật toán ở đây: https://en.wikipedia.org/wiki/List_of_random_number_generators
Mình chưa tìm hiểu về nó nên chưa biết nói thế nào, bạn xem link trên rồi search google thêm vax
Thử cách này xem sao:
Trời, tưởng chủ thớt hỏi về thuật toán chuyên sâu về mặt toán học cơ. nếu dùng hàm thì có thể làm thế này:
tạo một mảng a[k] gồm k phần tử.
int a[k] = {-1,-1,-1 …}
for(i=0;i<k;i++){
int temp = rand(1,n);
while( a “include” temp);
a[i] = temp;
}
rand(1,n) // đây là hàm random, hầu như ngôn ngữ lập trình nào cũng có sẵn hàm tương tự thế này, bạn có thể search theo ngôn ngữ lập trình của mình
mình biết có tồn tại hàm này bạn à
Nhưng mình nghĩ là vì là Random nên sẽ có trường hợp số random ra trùng với số mình đã lấy;
Và yêu cầu bài toán của mình thì ko được trùng nhau, nên mình mới hỏi trên diễn đàn.
Mình là beginner nên một số thứ còn chưa thạo bạn ạ.
Cảm ơn vì bạn đã giúp đỡ
À đâu, tại do mình đọc cái tiêu đề của cậu nên ms hiểu nhầm đó thôi :).
có thư viện random trong C11 , còn ko C dưới 11 thì có thư viện cstdlib.h , khai báo thêm hàm Ctime nữa , srand(0) % x + y; trong đó y là giá trị bé nhất , x -1 là giá trị max mình cũng không nhớ rõ lắm
srand (); để xuất ra
Bạn dùng một std::list (list1) chứa các số ban đầu, rồi rand(0 → list.length() - 1) để lấy ngẫu nhiên vị trí của các số trong list. Lấy được vị trí nào thì xoá nó khỏi list nên lần sau rand() thì không sợ trùng.
cảm ơn @noz1995 , cách của bạn khá dễ hiểu với beginner như mình ^^