Python:未从线性同余生成函数返回值
Python: Not Returning Value From Linear Congruential Generator Function
我正在尝试使用 LCG 方法制作随机生成的绘图。虽然情节行为有效,但我的问题是当我尝试 return 列表到变量时。我的目标是让递归函数 return 成为变量的列表,但它似乎在退出定义时什么也不做。
递归函数(内部定义):
def LCG_recursive(vmin, vmax):
for x in range(0, 1):
randnum = 19680801 # Fixing random state for reproducibility
randnum2 = [] # clearing list for next random set
break
for x in range(1, i+1):
randnum = ((a*randnum+b) % M) / M
randres = (vmax - vmin)*randnum + vmin #limit to range of plot
randnum2.append(randres)
if x>i:
return randnum2
呼叫方:
# For each set of style and range settings, plot i random points in the box
# defined [23, 32], y in [0, 100], z in [zlow, zhigh].
for m, zlow, zhigh in [('o', -50, -25), ('^', -30, -5)]:
xs = LCG_recursive(23, 32)
ys = LCG_recursive(0, 100)
zs = LCG_recursive(zlow, zhigh)
ax.scatter(xs, ys, zs, marker=m)
我的尝试是将种子设置为 randnum 并在每次检索随机生成的值列表时清除 randnum2。但是,尝试单步执行文件表明它成功执行了递归,但是 return 当它移动到下一个轴列表时是一个 NoneType 对象。
我尝试创建全局变量并检查我是否可以在执行递归操作后移动 randnum2,但我没有任何运气。
你的意思是:
def LCG_iterative(vmin, vmax):
randnum = 19680801 # Fixing random state for reproducibility
randnum2 = [] # clearing list for next random set
for _ in range(10):
randnum = ((a*randnum+b) % M) / M
randres = (vmax - vmin)*randnum + vmin #limit to range of plot
randnum2.append(randres)
return randnum2
它实际上最终需要一个 break 语句来强制它超出第二个范围,然后它才会让我 return 任何值。我确实注意到删除了前几行不必要的 for 循环。这是我想出的:
def LCG_calc(vmin, vmax):
randnum = 19680801 # Fixing random state for reproducibility
randnum2 = [] # clearing list for next random set
for x in range(0, n):
randnum = (a*randnum+b) % M
randnum = randnum /M
randres = (vmax - vmin)*randnum + vmin #limit to range of plot
randnum2.append(randres)
if x>n:
break
return randnum2
我正在尝试使用 LCG 方法制作随机生成的绘图。虽然情节行为有效,但我的问题是当我尝试 return 列表到变量时。我的目标是让递归函数 return 成为变量的列表,但它似乎在退出定义时什么也不做。
递归函数(内部定义):
def LCG_recursive(vmin, vmax):
for x in range(0, 1):
randnum = 19680801 # Fixing random state for reproducibility
randnum2 = [] # clearing list for next random set
break
for x in range(1, i+1):
randnum = ((a*randnum+b) % M) / M
randres = (vmax - vmin)*randnum + vmin #limit to range of plot
randnum2.append(randres)
if x>i:
return randnum2
呼叫方:
# For each set of style and range settings, plot i random points in the box
# defined [23, 32], y in [0, 100], z in [zlow, zhigh].
for m, zlow, zhigh in [('o', -50, -25), ('^', -30, -5)]:
xs = LCG_recursive(23, 32)
ys = LCG_recursive(0, 100)
zs = LCG_recursive(zlow, zhigh)
ax.scatter(xs, ys, zs, marker=m)
我的尝试是将种子设置为 randnum 并在每次检索随机生成的值列表时清除 randnum2。但是,尝试单步执行文件表明它成功执行了递归,但是 return 当它移动到下一个轴列表时是一个 NoneType 对象。
我尝试创建全局变量并检查我是否可以在执行递归操作后移动 randnum2,但我没有任何运气。
你的意思是:
def LCG_iterative(vmin, vmax):
randnum = 19680801 # Fixing random state for reproducibility
randnum2 = [] # clearing list for next random set
for _ in range(10):
randnum = ((a*randnum+b) % M) / M
randres = (vmax - vmin)*randnum + vmin #limit to range of plot
randnum2.append(randres)
return randnum2
它实际上最终需要一个 break 语句来强制它超出第二个范围,然后它才会让我 return 任何值。我确实注意到删除了前几行不必要的 for 循环。这是我想出的:
def LCG_calc(vmin, vmax):
randnum = 19680801 # Fixing random state for reproducibility
randnum2 = [] # clearing list for next random set
for x in range(0, n):
randnum = (a*randnum+b) % M
randnum = randnum /M
randres = (vmax - vmin)*randnum + vmin #limit to range of plot
randnum2.append(randres)
if x>n:
break
return randnum2