George Marsaglia编写了一个优秀的随机数发生器,它非常快速,简单,并且具有比Mersenne Twister高得多的周期.这是带有描述的代码:
我想将CMWC4096代码移植到Java,但它使用了几种无符号数据类型,因此我不确定如何正确执行此操作.这是完整的C代码:
/* choose random initial c<809430660 and */
/* 4096 random 32-bit integers for Q[] */
static unsigned long Q[4096],c=362436;
unsigned long CMWC4096(void) {
unsigned long long t, a=18782LL;
static unsigned long i=4095;
unsigned long x,r=0xfffffffe;
i = (i+1) & 4095;
t = a*Q[i] + c;
c = (t>>32);
x = t + c;
if (x < c) {
x++;
c++;
}
return (Q[i] = r - x);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以将其移植到Java吗?当您只有签名号码时,这是如何工作的?
编辑:谢谢大家快速解答!对于前1亿个数字,这个java代码似乎产生与C代码相同的结果.它比Java的java.util.Random快3倍.
public class ComplimentaryMultiplyWithCarryRandom { …Run Code Online (Sandbox Code Playgroud) #include<stdio.h>
int main()
{
printf("%d\n", sizeof(2147483648));
printf("%d" , sizeof(2147483647+1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
8
4
Run Code Online (Sandbox Code Playgroud)
我知道这sizeof(2147483648)是8个字节,因为它不能适合4个字节并被提升为long long int.但我不明白发生了什么事情sizeof(2147483647+1)
我发现了类似的问题,但没有讨论第二种情况.