簡體   English   中英

Cython隨機滾動不會產生預期的輸出

[英]Cython random roll does not produce the expected output

我正在遵循Hans Petter Langtangen的本教程 ,以便更快地了解Cython,以便快速生成隨機數。

作者有以下行:

r = 1 + int(rand()/(RAND_MAX*6.0))

在他的教程中,聲稱產生1到6之間的隨機整數。對我來說,它看起來像是一個錯誤,因為rand() (從libc.stdlib )生成一個從0到RAND_MAX的隨機整數,所以我猜線

r = 1 + int(6*rand()/(RAND_MAX(1.0))

應該更適合那里。 所以我創建了一個小的Cython腳本,它應該在1和n之間滾動一個隨機整數,同時打印調試消息。 這是腳本:

    from libc.stdlib cimport rand, RAND_MAX

    def print_rand(int n):
        cdef int r
        print "max", RAND_MAX
        cdef int roll
        roll = rand()
        print "roll", roll
        r = 1 + int(n*roll/(RAND_MAX*1.0))
        print r

然后我使用以下setup.py腳本編譯了腳本:

    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext

    setup(name='Random print',
          ext_modules=[Extension('_rand', ['rand.pyx'],)],
          cmdclass={'build_ext': build_ext},)

通過運行它

python setup.py build_ext --inplace

為了測試,我打開了IPython ,發生了以下謎團:

In [1]: import _rand

In [2]: _rand.print_rand(1000)
max 2147483647
roll 1804289383
1

但這沒有意義,因為

In [3]: 1 + int(1000*1804289383/(2147483647*1.0))
Out[3]: 841

我在這里錯過了什么?

乘法

n*roll

結果太大,無法融入Cython int。 與Python ints不同,它會在發生這種情況時自動切換到任意精度表示,Cython會像C一樣處理溢出。這通常意味着丟棄不適合的高位; 我不確定它是否是Cython中的未定義行為(在這種情況下會發生更糟糕的事情),或者Cython是否保證特定的溢出處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM