如何获取julia范围内的BigInt随机数?

Jay*_*Jay 3 random arbitrary-precision julia

我需要BigInt在Julia中获得1到1之间的随机数,但我在文档中找不到如何做到这一点.下面的代码是我认为可行的:

julia> rand(BigInt(1):BigInt(2^1000))
ERROR: integer division error
 in randu at random.jl:158
 in rand at random.jl:178
 in rand at random.jl:187
Run Code Online (Sandbox Code Playgroud)

编辑:提到的GregS 2^1000会绕零.实际上,2^1000结果为零,所以上面的代码是错误的.但使用BigInt(2)^1000不起作用:

julia> rand(BigInt(1):BigInt(2)^1000)
ERROR: InexactError()
 in convert at gmp.jl:108
 in colon at range.jl:38

julia> rand(BigInt(1):BigInt(2)^BigInt(1000))
ERROR: InexactError()
 in convert at gmp.jl:108
 in colon at range.jl:38
Run Code Online (Sandbox Code Playgroud)

完成这项工作的最快方法是什么?(你的数字应该是均匀分布的).

谢谢!

waT*_*eim 6

如果你使用ccall,这毕竟是可用的.我肯定在某些时候它会变得很狡猾,但现在这是一种方法,我没有找到从基地使用它的方法,但如果事情发生变化就会修改.需要进行2次调用才能使其正常工作.从gmp的文档中,我选择了mpz_urandomm

GMP支持

- Function:void mpz_urandomm(mpz_t rop,gmp_randstate_t state,const mpz_t n) 生成0到n-1范围内的均匀随机整数,包括0和n-1.

必须通过在调用此函数之前调用其中一个gmp_randinit函数(随机状态初始化)来初始化变量状态.

你必须首先初始化随机数生成器,我做的不是最佳,将用精炼的东西更新.

- Function:void gmp_randinit_default(gmp_randstate_t state) 使用默认算法初始化状态.这将是速度和随机性之间的折衷,建议用于没有特殊要求的应用.目前这是gmp_randinit_mt.

ccall方法

初始化RNG

没有一种优雅的方式来声明gmp_randstate_t,只需声明一个大缓冲区.这很重要,否则会发生段错误.

julia> buffer = Array(Uint8,32);
julia> ccall((:__gmp_randinit_default,:libgmp),Void,(Ptr{Uint8},),buffer);
Run Code Online (Sandbox Code Playgroud)

生成随机数

创建BigInt,x来存储结果

julia> x = BigInt(0)
0
Run Code Online (Sandbox Code Playgroud)

将y设置为MaxRange

julia> y = BigInt(2)^ 1000

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

生成随机x

julia> ccall((:__gmpz_urandomm,:libgmp),Void,(Ptr{BigInt},Ptr{Uint8},Ptr{BigInt}),&x,buffer,&y)
Run Code Online (Sandbox Code Playgroud)

校验

朱> X 9301165293246235069759966068146313776551258669855356477271940698500929939755418247622530571466332330697816620308003246225290293476785304004840090056840661553451916748315356563734257724978000166406621823207925733850455027807451108123161768212073821382033500073069184011344280494573919716117539236653172

等等...

julia> ccall((:__gmpz_urandomm,:libgmp),Void,(Ptr{BigInt},Ptr{Uint8},Ptr{BigInt}),&x,buffer,&y)
Run Code Online (Sandbox Code Playgroud)

朱> X 5073599723113217446035606058203362324610326948685707674578205618189982426100515602680640230141018758328161278469759835943678360952795440512680380424413847653984694781421269745198616340362470820037933917709243387214511018480191308767310495781355601069937334945556566243556239048498564021992916827796124