读取文件中的随机一行 Random Probability

本文介绍了一种从大文件中随机选择一行的算法,并适用于不能完全加载到内存的大文件和文件流。此外,还讨论了如何生成0到n-1范围内m个不重复随机整数的有序列表。
假设有一个文本文件,文件中有若干行。要求返回随机的一行。每行的被选概率相同。
两种情况:
1、如果文件很大,不能全放入内存
2、如果是文件流

大文件的特点是不能载入内存随机读取,文件流的特点是只能读取一次。

//伪代码
i = 1
chosen_line = ""
while line has next:
	# random returns a uniform random number in [0,1)
	if random() < 1/i:   
		chosen_line = line
		i += 1
	line = line.next
return chosen_line

类似随机选取问题:对于整数m和n,其中m<n,输出0~n-1范围内m个随机整数的有序列表,不允许重复。

void GenKnuth(int m, int n) 
{ 
	for(int i=0; i<n; ++i) 
	{ 
		if((bigrand()%(n-i)) < m) 
		{ 
			cout<<i<<endl; 
			--m; 
		}
	}
}

计算每个i被输出的概率,会发现都是m/n,因此是等概率的随机选取。


# 时间:2024年4月25日 Date: April 25, 2024 # 文件名称 Filename: 01-add_noise.py # 编码实现 Coding by: Yunfei Gui, Jinhuan Luo 邮箱 Mailbox:redsocks1043@163.com # 所属单位:中国 成都,西南民族大学(Southwest University of Nationality,or Southwest Minzu University), 计算机科学与工程学院. # 指导老师:周伟老师 # coding=utf-8 # 用于添加噪声的代码 import pandas as pd import numpy as np ''' 0:未添加噪声,表示正确数据 1:添加噪声,表示错误数据 ''' def add_noise_to_csv_448(output_file, noise_probability, noise_range, columns): # 读取输入文件为 DataFrame df = pd.read_csv('数据集Time_Series_448.dat', header=0) # 遍历指定的列 for col in columns: # 确保列存在 if col not in df.columns: print(f"警告:列 '{col}' 不存在于数据集中,跳过") continue # 根据噪声概率随机决定是否添加噪声 mask = np.random.choice([True, False], size=len(df), p=[noise_probability, 1 - noise_probability]) noise = np.random.uniform(noise_range[0], noise_range[1], size=len(df)) # 生成噪声 # 添加新的错误标志列 error_column = 'Error_' + col df[error_column] = pd.to_numeric(df[col], errors='coerce') # 确保是数值类型 df.loc[mask, error_column] = df.loc[mask, error_column] + noise[mask] # 添加噪声 # 将处理后的 DataFrame 写入输出文件 output_file df.to_csv(output_file, index=False) # 调用函数,传入输入文件路径、输出文件路径、噪声概率、噪声范围和要添加噪声的列 output_file_448 = 'modified_数据集Time_Series448_detail.dat' noise_probability_448 = 0.5 # 噪声概率为 0.5 noise_range_448 = (-2.0, 5.0) # 噪声范围为 -2.0 到 3.0 columns_448 = ['T_SONIC', 'CO2_density', 'CO2_density_fast_tmpr', 'H2O_density', 'H2O_sig_strgth', 'CO2_sig_strgth', 'RECORD'] # 要添加噪声的列 # 调用添加噪声的函数 # add_noise_to_csv_448(output_file_448, noise_probability_448, noise_range_448, columns_448) def add_noise_to_csv_660(output_file, noise_probability, noise_range, columns): # 读取输入文件为 DataFrame df = pd.read_csv('../002-数据集/数据集(含真实值)/modified_数据集Time_Series661.dat', header=0) # 创建一个新的 DataFrame 用于记录每行数据是否发生变化 # 遍历指定的列 for col in columns: # 确保列存在 if col not in df.columns: print(f"警告:列 '{col}' 不存在于数据集中,跳过") continue # 根据噪声概率随机决定是否添加噪声 mask = np.random.choice([True, False], size=len(df), p=[noise_probability, 1 - noise_probability]) noise = np.random.uniform(noise_range[0], noise_range[1], size=len(df)) # 生成噪声 # 添加新的错误标志列 error_column = 'Error_' + col df[error_column] = pd.to_numeric(df[col], errors='coerce') # 确保是数值类型 df.loc[mask, error_column] = df.loc[mask, error_column] + noise[mask] # 添加噪声 # 将处理后的 DataFrame 写入输出文件 output_file df.to_csv(output_file, index=False) # 调用函数,传入输入文件路径、输出文件路径、噪声概率、噪声范围和要添加噪声的列 output_file_660 = 'modified_数据集Time_Series661_detail.dat' noise_probability_660 = 0.4 # 噪声概率为 0.4 noise_range_660 = (-2.0, 4.0) # 噪声范围为 -2.0 到 4.0 columns_660 = ['T_SONIC', 'CO2_density', 'CO2_density_fast_tmpr', 'H2O_density', 'H2O_sig_strgth', 'CO2_sig_strgth', 'RECORD'] # 要添加噪声的列 # 调用添加噪声的函数 # add_noise_to_csv_660(output_file_660, noise_probability_660, noise_range_660, columns_660) ## 测试集 def add_noise_to_csv(output_file, noise_probability, noise_range, columns): # 读取输入文件为 DataFrame df = pd.read_csv('../002-数据集/数据集(含真实值)/modified_数据集Time_Series662.dat', header=0) # 创建一个新的 DataFrame 用于记录每行数据是否发生变化 # 遍历指定的列 for col in columns: # 确保列存在 if col not in df.columns: print(f"警告:列 '{col}' 不存在于数据集中,跳过") continue # 根据噪声概率随机决定是否添加噪声 mask = np.random.choice([True, False], size=len(df), p=[noise_probability, 1 - noise_probability]) noise = np.random.uniform(noise_range[0], noise_range[1], size=len(df)) # 生成噪声 # 添加新的错误标志列 error_column = 'Error_' + col df[error_column] = pd.to_numeric(df[col], errors='coerce') # 确保是数值类型 df.loc[mask, error_column] = df.loc[mask, error_column] + noise[mask] # 添加噪声 # 将处理后的 DataFrame 写入输出文件 output_file df.to_csv(output_file, index=False) # 调用函数,传入输入文件路径、输出文件路径、噪声概率、噪声范围和要添加噪声的列 output_file_662 = 'modified_数据集Time_Series662_detail.dat' noise_probability_662 = 0.5 # 噪声概率为 0.5 noise_range_662 = (-2.0, 2.0) # 噪声范围为 -2.0 到 2.0 columns_662 = ['T_SONIC', 'CO2_density', 'CO2_density_fast_tmpr', 'H2O_density', 'H2O_sig_strgth', 'CO2_sig_strgth'] # 要添加噪声的列 # 调用添加噪声的函数 add_noise_to_csv(output_file_662, noise_probability_662, noise_range_662, columns_662)为什么没有生成未添加噪声的数据
最新发布
11-10
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值