30/09/2018, 16:47

Hàm random trong C++

Chào mọi người, cho e hỏi làm thế nào để sử dụng hàm random cho một mảng mà các giá trị không bị lặp lại ạ?

Đỗ Mạnh Hà viết 18:48 ngày 30/09/2018

Sau khi bạn lấy giá trị của phần tử bạn vừa lấy bằng giá trị của hàm rand bạn xóa phần tử đó đi luôn thì sẽ không bị lặp lại đâu bạn.

Bạn không muốn làm thay đổi mảng giá trị thì bạn nên clone mảng đó ra rồi thao tác trên mảng clone là OK. Mảng gốc vẫn nguyên.

Nếu mà sau n lần xóa mảng đó rỗng thì bạn lại check xem mảng đó rỗng chưa để lại clone ra 1 mảng khác, như vậy sẽ không bị gián đoạn khi lấy giá trị.

linhtinh viết 18:52 ngày 30/09/2018

là như thế nào hả bạn? ví dụ mình muốn lấy giá trị rand từ 0-15 cho một mảng 16

Đỗ Mạnh Hà viết 18:51 ngày 30/09/2018

Thì bạn lấy xong bạn xóa phần tử vừa lấy trong mảng đó đi như vậy từ sau giá trị nó sẽ không có thằng vừa lấy nữa.

linhtinh viết 19:03 ngày 30/09/2018

hỏi ngu tiếp nhưng mà xóa như thế nào hả bạn?

Đỗ Mạnh Hà viết 18:53 ngày 30/09/2018

Nếu bạn sử dụng List trong các ngôn ngữ bậc cao thì bạn chỉ cần gọi hàm remove(int i) để xóa phần tử.

Còn nếu bạn sử dụng ngôn ngữ bậc thấp mà dùng mảng thì bạn có thể set giá trị tại vị trí đó về một giá trị cụ thể nào đó. Xong bạn check nếu mà phần tử vừa random ra mà có giá trị như bạn set thì gọi tiếp random để nó bỏ qua giá trị đó. (Đó là 1 giải pháp)

linhtinh viết 18:56 ngày 30/09/2018

bạn có thể cụ thể hơn được không? mình dùng C++, mình chỉ muốn hỏi có thể chỉ dùng hàm rand hoán vị các phần tử hay không, hay buộc phải dùng giải pháp khác ví dụ như so sánh vs các phần tử trước đó, bạn có thể cho ví dụ cụ thể không?

Đỗ Mạnh Hà viết 18:58 ngày 30/09/2018

Hàm rand nó chỉ đưa ra 1 số ngẫu nhiên trong 1 khoảng mà bạn định nghĩa cho nó. Và giá trị có thể bị lặp lại.

Nếu bạn khong muốn bị lặp lại thì chỉ có cách dùng như trên thôi.

(Mình chỉ viết nhanh không theo cú pháp, bạn hiểu là được)

VD: Với ngôn ngữ bậc cao

araylist a = new arraylist();
a.add("first");
a.add("second");
a.add("third");
arraylist b = a;
function randVal() {
    if (b.length == 0) b = a;
    int index = rand(0, b.length);
    println(b[index]);
    b.remove(index);
}

Với ngôn ngữ bậc thấp

string[] a = {"first", "second", "third"};
string[] b = a;
int dem = 0;
function randVal() {
    if (dem == b.length) {
        dem = 0;
        b = a;
    }
    int index = rand(0, b.length - dem);
    println(b[index]);
    b.remove(index);
    dem++;
}
linhtinh viết 18:52 ngày 30/09/2018

Cảm ơn bạn nhiều

Bài liên quan
0