Kỹ thuật tôi thường sử dụng khi danh sách là chiều dài 1 là để tạo ra một ngẫu nhiên nguyên r
trong [1,n-1]
, và nếu r
là lớn hơn hoặc bằng giá trị mà đơn bất hợp pháp sau đó tăng r
.
Điều này có thể được tổng quát cho danh sách chiều dài k
cho số k
nhỏ nhưng yêu cầu phân loại danh sách đó (bạn không thể so sánh và tăng theo thứ tự ngẫu nhiên). Nếu danh sách dài vừa phải, sau đó sau khi sắp xếp, bạn có thể bắt đầu bằng bsearch và thêm số lượng giá trị được bỏ qua vào r
và sau đó chuyển vào phần còn lại của danh sách.
Đối với một danh sách dài k
, không chứa giá trị lớn hơn hoặc bằng n-k
, bạn có thể làm một thay trực tiếp hơn: tạo ra ngẫu nhiên r
trong [1,n-k]
, và sau đó lặp qua các thử nghiệm danh sách nếu r
bằng list[i]
. Nếu đó là thì đặt r
thành n-k+i
(giả định này là list
là không dựa trên số 0) và thoát.
Cách tiếp cận thứ hai không thành công nếu một số phần tử danh sách nằm trong số [n-k,n]
.
tôi có thể cố gắng đầu tư một cái gì đó thông minh vào thời điểm này, nhưng những gì tôi có cho đến nay dường như đủ để phân phối đều liên tục với giá trị của k
nhiều ít hơn n
...
- Tạo hai danh sách - một trong các giá trị bất hợp pháp bên dưới
n-k
và các giá trị còn lại (điều này có thể được thực hiện tại chỗ).
- Tạo ngẫu nhiên
r
trong [1,n-k]
- Áp dụng các phương pháp thay thế trực tiếp cho danh sách đầu tiên (nếu
r
là list[i]
sau đó thiết lập r
để n-k+i
và đi đến bước 5).
- Nếu
r
không bị thay đổi ở bước 3 thì chúng tôi đã hoàn tất.
- Sắp xếp danh sách các giá trị lớn hơn và sử dụng phương pháp so sánh và tăng dần.
Quan sát:
- Nếu tất cả các giá trị trong một danh sách thấp hơn, sẽ không có loại vì không có gì để sắp xếp được.
- Nếu tất cả các giá trị nằm trong danh sách trên, sẽ không có loại nào vì không có sự kiện nào trên đó
r
được di chuyển vào khu vực nguy hiểm.
- Làm cách tiếp cận
k
n
, kích thước tối đa của danh sách trên (được sắp xếp) tăng lên.
- Đối với một số
k
, nếu có nhiều giá trị xuất hiện trong danh sách trên (loại càng lớn), cơ hội nhận được lần truy cập trong danh sách thấp hơn sẽ giảm, giảm khả năng cần sắp xếp.
Sàng lọc: Rõ ràng mọi thứ trở nên rất sorty cho lớn k
, nhưng trong những trường hợp như vậy danh sách này có tương đối ít lỗ vào đó r
được phép định cư. Điều này chắc chắn có thể được khai thác.
Tôi có thể đề xuất điều gì đó khác nếu có nhiều giá trị ngẫu nhiên với cùng một danh sách và giới hạn là cần thiết. Tôi hy vọng rằng danh sách các giá trị bất hợp pháp không phải là danh sách kết quả của các cuộc gọi trước đó đến chức năng này, bởi vì nếu đó là bạn sẽ không muốn bất kỳ điều này - thay vào đó bạn sẽ muốn một shuffle Fisher-Yates.
Tôi giả sử bạn muốn nó được hiệu quả thay vì chỉ tạo số cho đến khi nó không có trong danh sách của bạn? –
"Danh sách có thể không được sắp xếp" - Tôi đang đọc phần này "được trình bày chưa phân loại" thay vì "bạn không thể sắp xếp danh sách". Có thể hữu ích khi chỉ định các ngôn ngữ triển khai có thể có. Python và C++ đã thiết lập chức năng sẽ hữu ích, ví dụ: – Spaceghost
Nếu n nhỏ bạn có thể tạo danh sách các phần tử, ví dụ của bạn mảng sẽ là {2,5,6,7,44,46, .. 500 } (bạn nhận được điểm) và sau đó chỉ cần tạo ra một chỉ số ngẫu nhiên như rand (493) trong ví dụ của bạn. và lấy phần tử từ mảng [rand (493)]. – Mark