R: 关于“set.seed()”

本文探讨计算机如何生成伪随机数及其种子设置的原理与应用,强调了种子设置在确保结果可重复性和研究复现性方面的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2013-05-04 08:22:33
计算机并不能产生真正的随机数,如果你不设种子,计算机会用系统时钟来作为种子,如果你要模拟什么的话,每次的随机数都是不一样的,这样就不方便你研究,如果你事先设置了种子,这样每次的随机数都是一样的,便于重现你的研究,也便于其他人检验你的分析结果。
http://bbs.pinggu.org/thread-336973-1-1.html
http://bbs.pinggu.org/thread-2121186-1-1.html
如果说函数中出现set.seed(3000),那就是说程序运行3000次,都是从同一个种子产生的随机数,还是从不同的种子产生的?
            另外,这个3000,指的是3000“个”随机数,还是3000“批”(一批里面可能有若干个)随机数呢?
          如果我每循环一次,让set.seed(N)中的N增加一个常数,那会有什么作用?
et.seed(3000),不是运行3000次,而是把种子设置为3000。
计算机的程序,都是通过确定的算法,根据确定的输入,算出确定的输出。想要得到真正的随机,需要通过外接物理随机数发生器,通过把随机的物理过程转变为随机值,才能实现。因此我们平常使用的计算机的随机数,其实都只是通过算法模拟得到,也就是伪随机。一般采用的办法是线性同余(参见 http://en.wikipedia.org/wiki/Linear_congruential_generator)。
X[n+1] = (a * X[n] + c) mod m
为简单起见,我取简单的参数(a = 1, c = 3, m = 5),得到一个简单的算式:
X[n+1] = (X[n] + 3) mod 5
这时,把X[0]视为种子,于是:
若种子为0,得到数列:0, 3, 1, 4, 2, 0, …
若种子为1,得到数列:1, 4, 2, 0, 3, 1, …
若种子为2,得到数列:2, 0, 3, 1, 4, 2, …
若种子为3,得到数列:3, 1, 4, 2, 0, 3, …
若种子为4,得到数列:4, 2, 0, 3, 1, 4, …
对于每个种子,所得到的数列看起来都是随机的(每个数值出现的频率都是相同的)。而一旦种子给定,每次调用随机数函数,函数都会根据上次得到的数列的某个值,计算出数列的下一个值并返回回来。而对于随机浮点数,一般是用随机产生的整数除以最大整数得到。
所以,随机数的种子一般只需要在调用随机函数之前设置一次,不建议设置多次。
另外,我一直没有搞明白一件事:设置多次种子,在算法上会不会对最终生成的随机数的分布造成影响?不知道有人了解么?
http://cos.name/cn/topic/15925
可以重复得到同一组伪随机数很重要。比如,你的程序有一个很隐蔽的错误,导致你用某些初始值会得到错误的结果,如果你没有设定种子,运行完程序一看结果错了,这时你肯定想再用刚才的数据做一次debug,但永远不可能得到它了。再比如,写论文的时候,你的结果要给别人看,那么一个可重复使用的数据就很重要,你要让别人运行你的code也能得到你的结果就必须要设定种子,等等。
http://cos.name/cn/topic/106976

原文链接: http://tezhengku.com/topic/?p=604
import requests from bs4 import BeautifulSoup import os import re from urllib.parse import urljoin # 定义关键词列表 KEYWORDS = [""] def sanitize_text(text): """增强型文本清洗""" # 去除HTML标签 text = re.sub(r'<[^>]+>', '', text) # 去除URL链接 text = re.sub(r'https?://\S+', '', text) # 替换HTML实体 replacements = { '&nbsp;': ' ', '&': '&', '"': '"', '<': '<', '>': '>' } for k, v in replacements.items(): text = text.replace(k, v) # 清理特殊符号 text = re.sub(r'[■◆▼©®™●【】]', '', text) # 规范化空格 text = re.sub(r'\s+', ' ', text).strip() return text def save_content(url, desktop_path): """安全获取并保存网页内容""" try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} response = requests.get(url, headers=headers, timeout=10) response.encoding = 'utf-8' if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') main_content = soup.find(['article', 'div'], class_=re.compile(r'content|main')) clean_text = sanitize_text(main_content.get_text() if main_content else soup.get_text()) # 生成安全文件名 filename = re.sub(r'[\\/*?:"<>|]', '', url.split('/')[-1])[:50] + '.txt' filepath = os.path.join(desktop_path, filename) with open(filepath, 'w', encoding='utf-8') as f: f.write(clean_text) print(f'成功保存: {filename}') else: print(f'访问失败: {url} 状态码: {response.status_code}') except Exception as e: print(f'处理{url}时出错: {str(e)}') def main(): """主程序""" # 获取桌面路径(跨平台) desktop = os.path.join(os.path.expanduser('~'), 'Desktop') # 模拟种子页面(需合法授权后替换实际目标网站) seed_url = "http://www.81.cn/" # 示例地址 try: res = requests.get(seed_url, timeout=10) soup = BeautifulSoup(res.text, 'html.parser') # 提取包含关键词的链接 links = [] for a in soup.find_all('a', href=True): text = a.get_text().strip() if any(keyword in text for keyword in KEYWORDS): absolute_url = urljoin(seed_url, a['href']) links.append(absolute_url) # 去重处理 unique_links = list(set(links)) # 保存内容(建议控制频率) for link in unique_links[:9]: # 示例仅处理前5条 save_content(link, desktop) except Exception as e: print(f'程序终止: {str(e)}') if __name__ == "__main__": main() 在上述代码基础上将所有输出的txt保存在桌面的一个新的文件夹中,给出完整代码
03-13
import requests from bs4 import BeautifulSoup import os import re from urllib.parse import urljoin # 定义关键词列表 KEYWORDS = [""] def sanitize_text(text): """增强型文本清洗""" text = re.sub(r'<[^>]+>', '', text) text = re.sub(r'https?://\S+', '', text) replacements = { '&nbsp;': ' ', '&': '&', '"': '"', '<': '<', '>': '>' } for k, v in replacements.items(): text = text.replace(k, v) text = re.sub(r'[■◆▼©®™●【】]', '', text) text = re.sub(r'\s+', ' ', text).strip() return text def save_content(url, save_folder): """安全获取并保存网页内容""" try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} response = requests.get(url, headers=headers, timeout=10) response.encoding = 'utf-8' if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') main_content = soup.find(['article', 'div'], class_=re.compile(r'content|main')) clean_text = sanitize_text(main_content.get_text() if main_content else soup.get_text()) # 生成安全文件名 filename = re.sub(r'[\\/*?:"<>|]', '', url.split('/')[-1])[:50] + '.txt' filepath = os.path.join(save_folder, filename) with open(filepath, 'w', encoding='utf-8') as f: f.write(clean_text) print(f'成功保存至: {filepath}') else: print(f'访问失败: {url} 状态码: {response.status_code}') except Exception as e: print(f'处理{url}时出错: {str(e)}') def main(): """主程序""" # 设置保存路径 desktop = os.path.join(os.path.expanduser('~'), 'Desktop') folder_name = "ScrapedData" # 自定义文件夹名称 save_path = os.path.join(desktop, folder_name) # 创建保存目录(如果不存在) os.makedirs(save_path, exist_ok=True) # 模拟种子页面(需合法授权后替换实际目标网站) seed_url = "http://www.81.cn/" # 示例地址 try: res = requests.get(seed_url, timeout=10) soup = BeautifulSoup(res.text, 'html.parser') # 提取包含关键词的链接 links = [] for a in soup.find_all('a', href=True): text = a.get_text().strip() if any(keyword in text for keyword in KEYWORDS): absolute_url = urljoin(seed_url, a['href']) links.append(absolute_url) # 去重处理 unique_links = list(set(links)) # 保存内容(建议控制频率) for link in unique_links[:5]: # 示例仅处理前5条 save_content(link, save_path) except Exception as e: print(f'程序终止: {str(e)}') if __name__ == "__main__": main() 在上述代码基础上将输出txt中没有内容的删除掉,请给出完整代码
最新发布
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangleijay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值