我的代码是一种运行用户输入的数学算法,但算法中有一个随机因素。用户可以选择导出算法给出的数据,但由于随机因素,.txt文件中导出的数据不同。有没有办法让GUI上显示的打印数据导出到文件中?感谢。
import random
import os.path
def main ():
print ("1.input numbers")
print ("2.run formula")
print ("3.export data")
maininput = int(input("Enter:"))
if maininput == 1:
number ()
if maininput == 2:
formula ()
if maininput == 3:
export ()
def number ():
number.one = int(input("first number"))
number.two = int(input("second number"))
number.repeat = int(input("times to be repeated"))
main ()
def formula ():
one = number.one
two = number.two
for x in range(1,number.repeat , +1):
print ("sequence:",x)
answer = one * two
factor = random.uniform (0.8 ,0.5)
final= answer * factor
print ("before random:",round (answer))
print ("after random:",round (final))
one = final
main ()
def export ():
one = number.one
two = number.two
filename = input ("file name?")
file = open (filename, "w")
for x in range (1,number.repeat , +1):
file.write ("sequence:" + str(x) + ":" + '\n')
answer = number.one * number.two
factor = random.uniform (0.8 ,0.5)
final= answer * factor
exanswer = round (answer)
exfinal = round (final)
file.write ("before random:" + str (exanswer) + '\n')
file.write ("after random:" + str (exfinal) + '\n')
number.one = exfinal
file.close()
main ()
main()
这简化为我可以编写代码并仍然提供对我的意图的理解。
答案 0 :(得分:0)
根据你的例子,我有几点要说你应该考虑纠正,但首先是你的主要问题:
您获得的结果会有所不同,因为您正在重新计算结果。从随机库中获取随机数每次都会有所不同,因此当您重新计算将其打印到文件的答案时,会生成一个新的不同随机因子,从而改变计算。
有两种相对简单的方法可以解决这个问题。 A)保存所有输出并且不重新计算,或者B)强制随机数发生器使用相同的序列两次。
我会让你弄清楚如何做第一个,但至于B)你要做的是确保在每次你想要它之前给随机数生成器相同的“种子”吐出相同的序列。在您的示例中,如果我们更改number()
函数中输入的数字,我们只希望输出更改,因此我们将提出“随机”种子。对于非基于安全性的任务,通常认为“足够好”可以将当前时间用于此目的:
from time import time
def number ():
number.one = int(input("first number"))
number.two = int(input("second number"))
number.repeat = int(input("times to be repeated"))
number.seed = time() #save this seed for each time we need to compute
main ()
然后准备rng输出相同的序列,你需要在每个for
循环之前将这个种子作为起点:
random.seed(number.seed)
这将确保您每次都可以同时调用formula()
和export()
并进行相同的数学计算。
在您的示例中,您使用number.one
,number.two
等作为全局变量..这本身确实有效,但您可以在这里非常快地遇到麻烦。你所做的是为你的数字函数赋值,它将你的变量存储在包含数字函数本身的对象中。将随机属性分配给任何旧对象都不适用于所有内容(如果您的变量属于“int”类型,则无法执行此操作等。)并且特别是预先存在的对象类型(在您的案例函数中)可能会开始奇怪地行为你不小心修改了错误的属性。有两种普遍接受的“正确”方法可以使用全局变量,希望能够防止这些问题。
第一个是在函数中使用global
关键字,你想要定义将在该函数范围之外使用的全局变量:
def number ():
global one #make these variables accessable in global context
global two
global repeat
global seed
one = int(input("first number"))
two = int(input("second number"))
repeat = int(input("times to be repeated"))
seed = time()
main ()
def formula ():
ONE = one #make local private copy of global variable
TWO = two
REPEAT = repeat
random.seed(seed)
for x in range(1, REPEAT, +1):
print ("sequence:",x)
answer = ONE * TWO
factor = random.uniform (0.8 ,0.5)
final= answer * factor
print ("before random:",round (answer))
print ("after random:",round (final))
ONE = final
main ()
执行全局变量的另一种方法实际上与使用number.xx
的方式类似,但是以更加可控的方式。您可以做的是创建一个空对象作为所有全局变量的容器。为此,我们将创建一个继承自python的object
类:
class globalcontext(object):
pass #we don't actually need this class to do anything fancy
globvars = globalcontext()
def number ():
globvars.one = int(input("first number"))
globvars.two = int(input("second number"))
globvars.repeat = int(input("times to be repeated"))
globvars.seed = time()
main ()
def formula ():
ONE = globvars.one #make local private copy of global variable
TWO = globvars.two
REPEAT = globvars.repeat
random.seed(globvars.seed)
for x in range(1, REPEAT, +1):
print ("sequence:",x)
answer = ONE * TWO
factor = random.uniform (0.8 ,0.5)
final= answer * factor
print ("before random:",round (answer))
print ("after random:",round (final))
ONE = final
main ()