我正在尝试为学校(我们有经济体系)制作一款彩票程序。
我的程序会生成数字并将其保存到文本文件中。当我想要从我的生成器中“抽取”数字时,我希望它可以确保有一个获胜者。
问:如何让Python从我的文本文件中选择一行随机数,并将其作为输出结果?
我正在尝试为学校(我们有经济体系)制作一款彩票程序。
我的程序会生成数字并将其保存到文本文件中。当我想要从我的生成器中“抽取”数字时,我希望它可以确保有一个获胜者。
问:如何让Python从我的文本文件中选择一行随机数,并将其作为输出结果?
如何让Python从我的文本文件中随机选择一行并将其输出为该行的内容?
假设文件相对较小,以下可能是最简单的方法:
import random
line = random.choice(open('data.txt').readlines())
如果文件非常大,您可以根据文件大小随机查找文件中的某个位置,然后获取下一行完整的内容:
import os, random
def get_random_line(file_name):
total_bytes = os.stat(file_name).st_size
random_point = random.randint(0, total_bytes)
file = open(file_name)
file.seek(random_point)
file.readline() # skip this line to clear the partial line
return file.readline()
def random_line():
line_num = 0
selected_line = ''
with open(filename) as f:
while 1:
line = f.readline()
if not line: break
line_num += 1
if random.uniform(0, line_num) < 1:
selected_line = line
return selected_line.strip()
我的第一反应是:
import random
def pick_winner(self):
lines = []
with open("file.txt", "r") as f:
lines = f.readlines();
random_line_num = random.randrange(0, len(lines))
return lines[random_lines_num]
通过对输入文件进行轻微修改(在第一行存储项目数),您可以选择一个数字而无需先将整个文件读入内存。
import random
def choose_number( frame ):
with open(fname, "r") as f:
count = int(f.readline().strip())
for line in f:
if not random.randrange(0, count):
return int(line.strip())
count-=1
random.randrange
。只需随机选择行号并前进到该行即可。 - mataimport random, fileinput
text = None
for line in fileinput.input('data.txt'):
if random.randrange(fileinput.lineno()) == 0:
text = line
print text
分发:
$ seq 1 10 > data.txt
# run for 100000 times
$ ./select.py > out.txt
$ wc -l out.txt
100000 out.txt
$ sort out.txt | uniq -c
10066 1
10004 10
10023 2
9979 3
9926 4
9936 5
9878 6
10023 7
10154 8
10011 9
randrange(0,1)
将始终返回0),但除非没有选择其他数字,否则永远不会返回1。 请注意,您的分布看起来像一个倒置的钟形曲线,极端数字的选择频率比中间数字高得多。 - chepner我看了一些Python教程,发现了这个片段:
def randomLine(filename):
#Retrieve a random line from a file, reading through the file once
fh = open("KEEP-IMPORANT.txt", "r")
lineNum = 0
it = ''
while 1:
aLine = fh.readline()
lineNum = lineNum + 1
if aLine != "":
#
# How likely is it that this is the last line of the file ?
if random.uniform(0,lineNum)<1:
it = aLine
else:
break
nmsg=it
return nmsg
#this is suposed to be a var pull = randomLine(filename)