为什么 C# 中的 Random 构造函数在方法末尾分配 Seed 参数?
Why Random constructor in c# assigns Seed parameter in the end of the method?
我检查了 .Net here 的 Random class 的源代码。让我吃惊的是最后一行
public Random(int Seed) {
int ii;
int mj, mk;
//Initialize our Seed array.
//This algorithm comes from Numerical Recipes in C (2nd Ed.)
int subtraction = (Seed == Int32.MinValue) ? Int32.MaxValue : Math.Abs(Seed);
mj = MSEED - subtraction;
SeedArray[55]=mj;
mk=1;
for (int i=1; i<55; i++) { //Apparently the range [1..55] is special (Knuth) and so we're wasting the 0'th position.
ii = (21*i)%55;
SeedArray[ii]=mk;
mk = mj - mk;
if (mk<0) mk+=MBIG;
mj=SeedArray[ii];
}
for (int k=1; k<5; k++) {
for (int i=1; i<56; i++) {
SeedArray[i] -= SeedArray[1+(i+30)%55];
if (SeedArray[i]<0) SeedArray[i]+=MBIG;
}
}
inext=0;
inextp = 21;
Seed = 1;
}
方法末尾赋值的目的是什么?
在那里设置Seed
没有用。是局部值类型变量,构造函数结束后没有用
我想这只是一个错误。
因为 Seed
参数没有被 ref
传递并且 int
是一个值类型,所以最后一行没有任何效果。
感谢@Alex K 指出这一点,在检查了他们在 C 中的数字食谱 中采用的算法后,他们确实复制并粘贴了最后一行:
if ( * idum < 0 || iff == 0) {
Initialization.
iff = 1;
mj = labs(MSEED - labs( * idum));
Initialize ma[55] using the seed idum and the
mj %= MBIG;
large number MSEED.
ma[55] = mj;
mk = 1;
for (i = 1; i <= 54; i++) {
ii = (21 * i) % 55;
ma[ii] = mk;
mk = mj - mk;
if (mk < MZ) mk += MBIG;
mj = ma[ii];
}
for (k = 1; k <= 4; k++)
(i = 1; i <= 55; i++) {
ator.”
ma[i] -= ma[1 + (i + 30) % 55];
if (ma[i] < MZ) ma[i] += MBIG;
}
inext = 0;
inextp = 31;
* idum = 1;
}
这是对 Numerical Recipies in C (2nd Edition) 一书(第 283 页)中的 float rand3(long *idum)
函数的错误翻译。有这部分初始化种子数组(idum
是种子参数):
iff=1;
mj=labs(MSEED-labs(*idum));
mj %= MBIG; large number MSEED.
ma[55]=mj;
mk=1;
for (i=1;i<=54;i++) {
ii=(21*i) % 55;
ma[ii]=mk;
mk=mj-mk;
if (mk < MZ) mk += MBIG;
mj=ma[ii];
}
for (k=1;k<=4;k++)
(i=1;i<=55;i++) {
ma[i] -= ma[1+(i+30) % 55];
if (ma[i] < MZ) ma[i] += MBIG;
}
inext=0;
inextp=31;
*idum=1;
译者没有将种子参数设置为ref
。因此该行在 C# 翻译中没有影响。
我检查了 .Net here 的 Random class 的源代码。让我吃惊的是最后一行
public Random(int Seed) {
int ii;
int mj, mk;
//Initialize our Seed array.
//This algorithm comes from Numerical Recipes in C (2nd Ed.)
int subtraction = (Seed == Int32.MinValue) ? Int32.MaxValue : Math.Abs(Seed);
mj = MSEED - subtraction;
SeedArray[55]=mj;
mk=1;
for (int i=1; i<55; i++) { //Apparently the range [1..55] is special (Knuth) and so we're wasting the 0'th position.
ii = (21*i)%55;
SeedArray[ii]=mk;
mk = mj - mk;
if (mk<0) mk+=MBIG;
mj=SeedArray[ii];
}
for (int k=1; k<5; k++) {
for (int i=1; i<56; i++) {
SeedArray[i] -= SeedArray[1+(i+30)%55];
if (SeedArray[i]<0) SeedArray[i]+=MBIG;
}
}
inext=0;
inextp = 21;
Seed = 1;
}
方法末尾赋值的目的是什么?
在那里设置Seed
没有用。是局部值类型变量,构造函数结束后没有用
我想这只是一个错误。
因为 Seed
参数没有被 ref
传递并且 int
是一个值类型,所以最后一行没有任何效果。
感谢@Alex K 指出这一点,在检查了他们在 C 中的数字食谱 中采用的算法后,他们确实复制并粘贴了最后一行:
if ( * idum < 0 || iff == 0) {
Initialization.
iff = 1;
mj = labs(MSEED - labs( * idum));
Initialize ma[55] using the seed idum and the
mj %= MBIG;
large number MSEED.
ma[55] = mj;
mk = 1;
for (i = 1; i <= 54; i++) {
ii = (21 * i) % 55;
ma[ii] = mk;
mk = mj - mk;
if (mk < MZ) mk += MBIG;
mj = ma[ii];
}
for (k = 1; k <= 4; k++)
(i = 1; i <= 55; i++) {
ator.”
ma[i] -= ma[1 + (i + 30) % 55];
if (ma[i] < MZ) ma[i] += MBIG;
}
inext = 0;
inextp = 31;
* idum = 1;
}
这是对 Numerical Recipies in C (2nd Edition) 一书(第 283 页)中的 float rand3(long *idum)
函数的错误翻译。有这部分初始化种子数组(idum
是种子参数):
iff=1;
mj=labs(MSEED-labs(*idum));
mj %= MBIG; large number MSEED.
ma[55]=mj;
mk=1;
for (i=1;i<=54;i++) {
ii=(21*i) % 55;
ma[ii]=mk;
mk=mj-mk;
if (mk < MZ) mk += MBIG;
mj=ma[ii];
}
for (k=1;k<=4;k++)
(i=1;i<=55;i++) {
ma[i] -= ma[1+(i+30) % 55];
if (ma[i] < MZ) ma[i] += MBIG;
}
inext=0;
inextp=31;
*idum=1;
译者没有将种子参数设置为ref
。因此该行在 C# 翻译中没有影响。