Java实现随机抽样


编程实现对数据记录的随机抽样。给定概率p,依概率p对给定的数据集合进行随机抽样。

比如说现在在一个数组中存放了10000位同学的身高和体重信息,现在需要你对这100位同学以概率p=0.002进行抽样,随机取出这10000位同学中约20位同学的信息。

  1. import java.io.BufferedReader;  
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;  
  4. import java.io.LineNumberReader;  
  5. import java.util.Random;  
  6. import java.util.Scanner;  
  7. import java.io.InputStreamReader;  
  8. public class ReadSelectedLine {  
  9.     // 读取制定行   
  10.     static void readLineVarFile(String fileName, int lineNumber)  
  11.             throws IOException {  
  12.         BufferedReader reader = new BufferedReader(new InputStreamReader(  
  13.                 new FileInputStream(fileName)));  
  14.         String line = reader.readLine();  
  15.         int num = 0;  
  16.         while (line != null) {  
  17.             if (lineNumber == ++num) {  
  18.                 System.out.println("line   " + lineNumber + ":   " + line);  
  19.             }  
  20.             line = reader.readLine();  
  21.         }  
  22.         reader.close();  
  23.     }  
  24.     // 文件内容的总行数。   
  25.     static int getTotalLines(String fileName) throws IOException {  
  26.         BufferedReader in = new BufferedReader(new InputStreamReader(  
  27.                 new FileInputStream(fileName)));  
  28.         LineNumberReader reader = new LineNumberReader(in);  
  29.         String s = reader.readLine();  
  30.         int lines = 0;  
  31.         while (s != null) {  
  32.             lines++;  
  33.             s = reader.readLine();  
  34.         }  
  35.         reader.close();  
  36.         in.close();  
  37.         return lines;  
  38.     }  
  39.     public static void main(String[] args) throws IOException {  
  40.         // 读取文件   
  41.         String fileName = "D:/student_info.txt";  
  42.         // 获取文件的内容的总行数   
  43.         int totalNo = getTotalLines(fileName);  
  44.         System.out.println("There are " + totalNo + " lines in the text!");  
  45.         System.out.print("input the /"gailv/"(0.0-1.0): ");  
  46.         Scanner scanner = new Scanner(System.in);  
  47.         float gailv = scanner.nextFloat();  
  48.         int del_num = (int) (totalNo * gailv);  
  49.         for (int i = 0; i < del_num; i++) {  
  50.             Random rand = new Random();  
  51.             // 指定读取的行号   
  52.             int lineNumber = (int) (rand.nextDouble() * totalNo);  
  53.             // 读取指定行的内容   
  54.             readLineVarFile("d:/student_info.txt", lineNumber);  
  55.         }  
  56.     }  
  57. }  

(注意:外部文件的文件名与路径) 

关于随机抽样算法,我采用的是,先通过读取外部文件(存放需要进行随机抽样信息的文件),然后统计出该文件的行数(前提是需要抽样的样本必须是每一行存放一条对应信息),再通过随机算法产生出需要抽取的样本所对应的行号(通过输入抽样概率,计算出样本),最后输出随机抽样结果。本程序使用循环覆盖所读取文件的内容,可以很好解决内存消耗问题。

相关内容