Python固定随机日期生成问题:同输入多次运行返回相同日期
解决同一输入值生成固定随机日期的问题
你的核心问题在于全局的prop是每次运行脚本时随机生成的单一值,这会导致两个关键问题:一是每次重启脚本,prop都会重新生成,结果自然不同;二是所有输入行共用同一个prop,没法为不同的输入日期生成差异化的随机结果。要实现「同一输入值无论运行多少次都返回相同随机日期」,关键是把随机值和输入的日期绑定起来——用输入日期生成固定的随机种子,而不是用全局随机数。
解决方案:基于输入日期的固定哈希值生成随机种子
我们可以为每个输入的日期字符串生成一个固定的哈希值,用它作为随机数生成器的种子。这样同一个日期字符串的哈希值永远不变,对应的随机数也会固定,最终生成的随机日期也就一致了。
修改后的完整代码示例
import pandas as pd import time import random def gen_exp_dt(input_date, start_dttm, end_dttm, date_format): # 用输入日期的哈希值作为固定种子 seed = hash(input_date) random.seed(seed) prop = random.random() # 转换起始/结束时间为时间戳 stime = time.mktime(time.strptime(start_dttm, date_format)) etime = time.mktime(time.strptime(end_dttm, date_format)) # 计算随机时间戳并转换为日期字符串 rtime = stime + (prop * (etime - stime)) return time.strftime(date_format, time.localtime(rtime)) # 读取输入数据 in_df = pd.read_csv('file.txt', sep="\t", encoding='ISO-8859-1', usecols=['MY_DATE']) # 为每行生成固定的随机日期 in_df['FIXED_RANDOM_DATE'] = in_df['MY_DATE'].apply( lambda x: gen_exp_dt( input_date=x, start_dttm='2020-01-01', # 替换为你的起始日期 end_dttm='2023-12-31', # 替换为你的结束日期 date_format='%Y-%m-%d' # 替换为你的日期格式 ) ) print(in_df)
为什么这样能解决问题?
hash(input_date)会将同一个日期字符串转换为固定的整数(只要字符串内容不变,哈希值就不会变),用这个整数作为random.seed()的参数后,每次调用random.random()都会得到完全相同的prop值。- 每个输入日期都有自己专属的
prop,不同日期会生成不同的随机日期,但同一日期无论运行多少次脚本,结果都完全一致。
可选:更稳定的哈希方式(避免极低概率的哈希冲突)
如果担心hash()函数的冲突概率(虽然实际中几乎可以忽略),可以用hashlib生成更稳定的哈希值作为种子:
import hashlib def get_fixed_seed(input_str): # 用SHA256生成固定哈希,再转换为整数作为种子 hash_bytes = hashlib.sha256(input_str.encode('utf-8')).digest() return int.from_bytes(hash_bytes, byteorder='big') def gen_exp_dt(input_date, start_dttm, end_dttm, date_format): seed = get_fixed_seed(input_date) random.seed(seed) prop = random.random() stime = time.mktime(time.strptime(start_dttm, date_format)) etime = time.mktime(time.strptime(end_dttm, date_format)) rtime = stime + (prop * (etime - stime)) return time.strftime(date_format, time.localtime(rtime))
原代码的问题复盘
- 全局
prop不固定:每次运行脚本时prop = random.random()都会生成新的随机数,导致结果随脚本重启而变化。 - 单一
prop复用:所有输入行共用同一个prop,无法为不同输入生成差异化的随机日期。
内容的提问来源于stack exchange,提问作者TanviP
相关产品推荐
相关产品推荐

