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

chazo1994 viết 11:48 ngày 01/10/2018

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

Nguyễn Duy Hùng viết 11:45 ngày 01/10/2018

Thử cách này xem sao:

  • Nếu k = n thì tạo một vector chứa các số từ 1 đến n rồi dùng std::random_shuffle(v.begin(),v.end())
  • Nếu k < n thì cứ dùng hàm rand() tạo một số từ 1 đến n, đẩy vào một cái set cho tới khi set.size() == k thì dừng.
chazo1994 viết 12:01 ngày 01/10/2018

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

MoonLight viết 11:47 ngày 01/10/2018

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 đỡ

chazo1994 viết 12:01 ngày 01/10/2018

À đâu, tại do mình đọc cái tiêu đề của cậu nên ms hiểu nhầm đó thôi :).

2D_team_free_online_Education viết 12:00 ngày 01/10/2018

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

Trần Hoàn viết 11:45 ngày 01/10/2018

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ách đơn giản nhất để trộn một dãy là sử dụng std::list Giả sử bạn có 50 câu hỏi đánh số từ 1 đến 50 thì list thứ nhất sẽ chứa các số đó. Xong rồi random(0-list.length()) để lấy vị trí, gặp vị trí số nào thì đưa số đó vào list thứ 2 rồi xoá ở list thứ nhất. Lặp lại đến khi nào list thứ nhất không còn số.

MoonLight viết 11:57 ngày 01/10/2018

cảm ơn @noz1995 , cách của bạn khá dễ hiểu với beginner như mình ^^

Bài liên quan
0