Java实现随机抽样
Java实现随机抽样
编程实现对数据记录的随机抽样。给定概率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);
- }
- }
- }
(注意:外部文件的文件名与路径)
关于随机抽样算法,我采用的是,先通过读取外部文件(存放需要进行随机抽样信息的文件),然后统计出该文件的行数(前提是需要抽样的样本必须是每一行存放一条对应信息),再通过随机算法产生出需要抽取的样本所对应的行号(通过输入抽样概率,计算出样本),最后输出随机抽样结果。本程序使用循环覆盖所读取文件的内容,可以很好解决内存消耗问题。
评论暂时关闭