編程實現對數據記錄的隨機抽樣。給定概率p,依概率p對給定的數據集合進行隨機抽樣。
比如說現在在一個數組中存放了10000位同學的身高和體重信息,現在需要你對這100位同學以概率p=0.002進行抽樣,隨機取出這10000位同學中約20位同學的信息。
- import java.io.BufferedReader;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.LineNumberReader;
- import java.util.Random;
- import java.util.Scanner;
- import java.io.InputStreamReader;
- public class ReadSelectedLine {
- // 讀取制定行
- static void readLineVarFile(String fileName, int lineNumber)
- throws IOException {
- BufferedReader reader = new BufferedReader(new InputStreamReader(
- new FileInputStream(fileName)));
- String line = reader.readLine();
- int num = 0;
- while (line != null) {
- if (lineNumber == ++num) {
- System.out.println("line " + lineNumber + ": " + line);
- }
- line = reader.readLine();
- }
- reader.close();
- }
- // 文件內容的總行數。
- static int getTotalLines(String fileName) throws IOException {
- BufferedReader in = new BufferedReader(new InputStreamReader(
- new FileInputStream(fileName)));
- LineNumberReader reader = new LineNumberReader(in);
- String s = reader.readLine();
- int lines = 0;
- while (s != null) {
- lines++;
- s = reader.readLine();
- }
- reader.close();
- in.close();
- return lines;
- }
- public static void main(String[] args) throws IOException {
- // 讀取文件
- String fileName = "D:/student_info.txt";
- // 獲取文件的內容的總行數
- int totalNo = getTotalLines(fileName);
- System.out.println("There are " + totalNo + " lines in the text!");
- System.out.print("input the /"gailv/"(0.0-1.0): ");
- Scanner scanner = new Scanner(System.in);
- float gailv = scanner.nextFloat();
- int del_num = (int) (totalNo * gailv);
- for (int i = 0; i < del_num; i++) {
- Random rand = new Random();
- // 指定讀取的行號
- int lineNumber = (int) (rand.nextDouble() * totalNo);
- // 讀取指定行的內容
- readLineVarFile("d:/student_info.txt", lineNumber);
- }
- }
- }
(注意:外部文件的文件名與路徑)
關於隨機抽樣算法,我采用的是,先通過讀取外部文件(存放需要進行隨機抽樣信息的文件),然後統計出該文件的行數(前提是需要抽樣的樣本必須是每一行存放一條對應信息),再通過隨機算法產生出需要抽取的樣本所對應的行號(通過輸入抽樣概率,計算出樣本),最後輸出隨機抽樣結果。本程序使用循環覆蓋所讀取文件的內容,可以很好解決內存消耗問題。