Dưới đây là một giải pháp. Hãy xem phương thức select() thực hiện điều thực (phương thức main() lặp đi lặp lại các bài tập select(), để chỉ ra rằng phân phối thực sự khá đồng bộ).
Ý tưởng rất đơn giản: khi bạn đọc dòng đầu tiên, nó có 100% cơ hội được chọn là kết quả. Khi bạn đọc dòng thứ 2 nó có 50% cơ hội thay thế dòng đầu tiên là kết quả. Khi bạn đọc dòng thứ 3, nó có 33% cơ hội trở thành kết quả. Dòng thứ tư có 25%, v.v ...
import java.io.*;
import java.util.*;
public class B {
public static void main(String[] args) throws FileNotFoundException {
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i = 0; i < 1000; ++i)
{
String s = choose(new File("g:/temp/a.txt"));
if(!map.containsKey(s))
map.put(s, 0);
map.put(s, map.get(s) + 1);
}
System.out.println(map);
}
public static String choose(File f) throws FileNotFoundException
{
String result = null;
Random rand = new Random();
int n = 0;
for(Scanner sc = new Scanner(f); sc.hasNext();)
{
++n;
String line = sc.nextLine();
if(rand.nextInt(n) == 0)
result = line;
}
return result;
}
}
Nguồn
2010-02-07 19:52:13
Việc triển khai lấy mẫu hồ chứa – Will
Tuyệt vời. Không bao giờ nghe nói về lấy mẫu hồ chứa. Điều gì xảy ra nếu tệp của tôi là MB? Có bất kỳ vấn đề về hiệu suất nào không? Nếu có, có lựa chọn thay thế nào để tránh quét toàn bộ tệp không? –
Tôi có đúng và giả sử đây là một n = 1 cố định, trong đó n là số 'mẫu'? Có cách nào để chọn chọn nhiều hơn một lần không? vì nó là viết tắt của bạn 'trên băng' nhiều hơn một lần, hoặc ít nhất là cố gắng mà dường như không hiệu quả. – Pureferret