在Matlab中生成64位随机整数

时间:2013-04-09 13:08:57

标签: matlab random 64-bit

我正在尝试编写一个matlab函数,该函数生成一个二进制文件,其中包含一系列64位随机整数。这些应该是高质量的,这就是为什么我想使用64位mersenne twister算法或更好。内置的 randi()函数只能生成32位数。我之前使用以下方法生成了32位结果:

rng('shuffle', 'twister');
randi(2^32-1, 'uint32')

但这在64位中不可用。如果我没记错使用多个32位整数来生成64位随机整数是不好的做法,但如果有一个很好的解决方案我会对它开放。
为了使问题更加困难,我目前正在使用32位Windows XP机器。

3 个答案:

答案 0 :(得分:6)

似乎在Matlab中对64位随机整数(以及一般的64位整数)的支持仍然很差。

我怀疑“最佳”解决方法是做一些比特攻击:

% create 32-bit uints, and cast to 64-bit
f = @() uint64( randi([0 intmax('uint32')], 'uint32') );

% bitshift and bitor to convert into a proper uint64        
R = bitor( bitshift(f(),32), f() );

或使用Andrew Jake建议的typecast,以提高可读性:

f = @() randi([0 intmax('uint32')], 'uint32');
R = typecast([f() f()], 'uint64');

创建多个随机数时,您必须将g更改为:

% bitshift and bitor: 
% ------------

% create an Nx1 uint32, and cast to 64-bit
g = @(N) uint64( randi([0 intmax('uint32')], N,1, 'uint32') );

tic
R = bitor( bitshift(g(1e7),32), g(1e7) );
toc


% typecast 
% ------------

% create a 1xN uint32, but leave the casting to typecast
g = @(N) randi([0 intmax('uint32')], 1,N, 'uint32');

tic
R = typecast([g(1e7) g(1e7)], 'uint64');   
toc

结果:

Elapsed time is 0.717668 seconds.    % bitor/bitshift
Elapsed time is 0.705700 seconds.    % typecast w/ loop 

它们同样快,所以它真的是你喜欢的。

Mersenne Twister主页mentions,当连接两个uint32时,分发不会改变(谢谢安德鲁的抬头),所以你确实可以安全地做到这一点。

答案 1 :(得分:1)

this page判断,使用乘法滞后Fibonacci生成器是可能的。但是,根据一般标准,我认为它不会比mersenne twister表现更好。

此外,您需要一台64位机器才能运行64位Matlab。

编辑:This question也会建议64位版本的Matlab已经使用默认设置生成64位随机整数。

答案 2 :(得分:1)

如果您真的想要高质量的随机数,那么将发布64位版本的Mersenne Twister。这是它的C实现。它说这是“64位机器”,但我认为你也可以在32位机器上编译它 - 它只是使用unsigned long long,而不是64位指针。将其拖放到MEX文件中,您可以轻松地从M代码中调用它。

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt64.html

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/C-LANG/mt19937-64.c