线性同余生成器是最古老和最简单的方法之一:
int seed = 123456789;
int rand()
{
seed = (a * seed + c) % m;
return seed;
}
只需要使用基本算术操作,就能完成这个算法。
请注意,仅当以特定方式选择 a 、 c 和 m 时,此算法才能正常工作!
为了确保此序列的最长可能周期, c 和 m 应该是互质的, a - 1 应该可以被 m 的所有质因数整除,并且如果 m 可以被4整除,则也应该可以被4整除。
一些示例参数在维基百科上有展示:例如ANSI C编译器提出m = 2^31, a = 1103515245,c = 12345。
public long randomLong() {
x ^= (x << 21);
x ^= (x >>> 35);
x ^= (x << 4);
return x;
}
种子不能为0。来源:http://www.javamex.com/tutorials/random_numbers/xorshift.shtml#.VlcaYzKwEV8
更多信息请参见维基百科:https://en.wikipedia.org/wiki/Xorshift
int rand()
{
static int random = 0;
return random++;
}
我猜这对于大范围来说已经足够好了,但我还没有使用过。两个数字必须互质。
u32 rand()
{
static u32 seed = 3459173429;
seed = 910230123 + seed ;
return seed;
}
工作示例
int printf(char* , ...);
typedef unsigned int u32;
typedef signed int i32;
u32 rand()
{
static u32 seed = 3459173429;
seed = 910230123 + seed ;
return seed;
}
i32 randInt(i32 a, i32 b)
{
return (rand() % (b - a)) + a;
}
void main()
{
for(int i = 0 ; i < 10000 ; i += 1)
{
printf("%d\n", randInt(-50, 50));
}
}
我使用这个
SUBROUTINE GNA(iiseed)
USE Variaveis
parameter (ia=843314861,ib=453816693,m=1073741824, r231=1./2147483648.)
INTEGER :: iiseed
iiseed = ib + ia*iiseed
if (iiseed.lt.0) iiseed = (iiseed+m) + m
RndNum = iiseed*r231
END SUBROUTINE GNA
在编程中,可以通过不为程序中每次调用随机数生成器创建一个新的随机数生成器来实现更大的随机性收益,而无需花费更多的计算时间。
这是一个非常好的技巧!