Tôi có một phương pháp, sử dụng các mẫu ngẫu nhiên để tính toán gần đúng. Phương pháp này được gọi là hàng triệu lần, do đó, điều rất quan trọng là quá trình chọn các số ngẫu nhiên là hiệu quả.Chọn các số ngẫu nhiên hiệu quả
Tôi không chắc chắn javas nhanh như thế nào Random().nextInt
thực sự là như vậy, nhưng chương trình của tôi dường như không được hưởng lợi nhiều như tôi cũng muốn nó.
Khi chọn số ngẫu nhiên, tôi làm như sau (trong bán pseudo-code):
// Repeat this 300000 times
Set set = new Set();
while(set.length != 5)
set.add(randomNumber(MIN,MAX));
Bây giờ, điều này rõ ràng là có một xấu trường hợp xấu nhất thời gian chạy, vì ngẫu nhiên chức năng về mặt lý thuyết có thể thêm số trùng lặp cho một cõi đời đời, do đó sẽ tồn tại trong vòng lặp while mãi mãi. Tuy nhiên, các con số được chọn từ {0..45}, do đó, hầu như không thể có giá trị trùng lặp.
Khi tôi sử dụng phương pháp trên, chỉ 40% nhanh hơn phương pháp khác của tôi, phương pháp này không gần đúng, nhưng cho kết quả chính xác. Điều này được chạy ~ 1 triệu lần, vì vậy tôi đã mong đợi phương pháp mới này nhanh hơn ít nhất 50%.
Bạn có đề xuất nào về phương pháp nhanh hơn không? Hoặc có thể bạn biết một cách hiệu quả hơn để tạo ra một tập hợp các số ngẫu nhiên.
Để làm rõ, đây là hai phương pháp:
// Run through all combinations (1 million). This takes 5 seconds
for(int c1 = 0; c1 < deck.length; c1++){
for(int c2 = c1+1; c2 < deck.length; c2++){
for(int c3 = c2+1; c3 < deck.length; c3++){
for(int c4 = c3+1; c4 < deck.length; c4++){
for(int c5 = c4+1; c5 < deck.length; c5++){
enumeration(hands, cards, deck, c1, c2, c3, c4, c5);
}
}
}
}
}
// Approximate (300000 combinations). This takes 3 seconds
Random rand = new Random();
HashSet<Integer> set = new HashSet<Integer>();
int[] numbers = new int[5];
while(enumerations < 300000){
set.clear();
while(set.size() != 5){
set.add(rand.nextInt(deck.length));
}
Iterator<Integer> i = set.iterator();
int n = 0;
while(i.hasNext()){
numbers[n] = i.next();
n++;
}
Sau một số thử nghiệm và hồ sơ, tôi thấy phương pháp này có hiệu quả nhất:
Random rand = new Random();
int[] numbers = new int[5];
ArrayList<Integer> list = new ArrayList<Integer>();
while(enumerations < 300000){
while(list.size() != 5) {
int i = rand.nextInt(deck.length);
if(!list.contains(i)) list.add(i);
}
int index = 0;
for(int i : list){ numbers[index] = i; index++; }
enumeration(hands, cards, deck,numbers);
}
Bạn có thể nghỉ ngơi những gì bạn đang cố gắng hoàn thành không? Bạn đang cố gắng tạo một tập hợp N số riêng biệt với mỗi cuộc gọi phương thức? Bạn nói về việc so sánh phương pháp này với phương pháp khác "không xấp xỉ" và phương pháp khác nhanh hơn - là tạo số ngẫu nhiên thực sự hay phương pháp của bạn để thực hiện một số tính toán khác (xấp xỉ so với không xấp xỉ)? –
Vấn đề là tạo số ngẫu nhiên. Các tính toán khác không liên quan, đó là lý do tại sao tôi không đề cập đến chúng trong câu hỏi của tôi. –