在Python中初始化静态变量

发布于 2024-12-22 19:16:05 字数 435 浏览 1 评论 0原文

上下文

假设我们要使用 Box-Muller 算法。从几个随机数 U1 和 U2 开始,我们可以生成 G1 和 G2。现在,对于任何调用,我们只想输出 G1 或 G2。在其他语言中,我们可以使用静态变量来知道是否需要生成一对新变量。在 Python 中如何实现呢?

我知道的第一个想法

是,关于 Python 中的静态变量已经说了很多,我还必须说我有点困惑,因为答案相当分散。我找到了这个 线程 和其中的引用。通过该线程,这里的解决方案是使用生成器。

细节决定成败

现在的问题是,我们如何初始化生成器以及如何保留(比如 G2)下一个yield

Context

Say, we want to use the Box-Muller algorithm. Starting from a couple of random numbers U1 and U2, we can generate G1 and G2. Now, for any call, we just want to output either G1 or G2. In other languages, we could use static variables to be able to know if we need to generate a new couple. How can it be done in Python?

First thoughts

I know, much had been said about static variables in Python, I also must say I'm a bit confused as the answers are quite scattered. I found this thread and references therein. By that thread, the solution here would be to use a generator.

The devil's in the details

Now, the problem is, how do we initialize the generator and how do we retain, say G2, for the next yield?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如此安好 2024-12-29 19:16:05

编写生成器是一个非常好的实践!

import random 
import math
def BoxMullerFormula(a,b):
    c = math.sqrt(-2 * math.log(a)) * math.cos(2 * math.pi * b)
    d = math.sqrt(-2 * math.log(a)) * math.sin(2 * math.pi * b)
    return (c,d)
def BoxM(): 
     while 1:
        Rand01 = random.random()
        Rand02 = random.random()
        (a,b) = BoxMullerFormula(Rand01,Rand02)
        yield a 
        yield b 

BoxM01 = BoxM()         
for i in xrange(10):
    print BoxM01.next() 

您还应该考虑拥有一个带有 get() 方法、re_initialize() 方法等的 BoxMuller 类。

Writing generators is a very good practice!

import random 
import math
def BoxMullerFormula(a,b):
    c = math.sqrt(-2 * math.log(a)) * math.cos(2 * math.pi * b)
    d = math.sqrt(-2 * math.log(a)) * math.sin(2 * math.pi * b)
    return (c,d)
def BoxM(): 
     while 1:
        Rand01 = random.random()
        Rand02 = random.random()
        (a,b) = BoxMullerFormula(Rand01,Rand02)
        yield a 
        yield b 

BoxM01 = BoxM()         
for i in xrange(10):
    print BoxM01.next() 

You should consider also having a class BoxMuller with a get() method, a re_initialize() one, and so on.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文