我正在将Visual Fox Pro代码迁移到C#。网
是什么让Visual Fox Pro:根据文本字符串(在文本框中捕获)生成一个 5 位数字的字符串("48963"),如果您总是输入相同的文本字符串将得到该字符串始终 5 位(没有反向),我的代码在 C# 中。NET 应生成相同的字符串。
有一些代码我不能在 dot.net 兰特(int)中播放
在VisualFoxPro中:
rand(intValue)
在 C#. net 中:
Random r = new Random ();
return r.Next(intValue);
在 C# 中,我无法基于相同的 intValue 生成单个值,我知道它们是非常不同的库(VFP 和 C #),但如果有任何方法可以匹配 Visual Fox Pro 和 C# 的方法,则不会。网
我想迁移以下代码(Visual Fox Pro 6 到 C#)
gnLower = 1000
gnUpper = 100000
vcad = 1
For y=gnLower to gnUpper step 52
genClave = **Rand(vcad)** * y
vRound = allt(str(int(genclave)))
IF Len(vRound) = 3
vDec = Right(allt(str(genClave,10,2)), 2)
finClave = vRound+vDec
Thisform.txtPass.value = Rand(971);
Exit
Endif
Next y
输出:
vcad = 1 return: 99905 vcad = 2 return: 10077 vcad = thanks return: 17200
NET 中的 Rand 不能保证在主要修订号之间相同,因此 2.0 中种子为 1234
的Rand()
可能与 4.0 中种子完全相同的Rand()
不同。
如果你必须匹配旧的 implintation,你需要找出 Visual Fox Pro 是如何实现其 Rand 功能的。但是,如果您想要相同的行为,但不是相同的数字,您可以对字符串进行哈希处理,只需输出即可。
Random r = new Random (myTextBox.Text.GetHashCode());
return r.Next();
现在这在加密上是不安全的,也不能保证在不同的计算机上生成相同的数字(它返回 32 到 64 位之间的不同数字,以及基于 .Net 运行时的不同版本(这实际上适用于GetHashCode
和Random
本身!)),所以不要将其存储为数据库!
如果您每次都需要从同一字符串中使用相同的数字,无论它在哪台计算机上,只需在 System.Security.Cryptography
命名空间中使用 RNGCryptoServiceProvider。
//Returns the same number between 0 and 255 every time.
using(var myRng = new RNGCryptoServiceProvider(myTextBox.Text))
{
var ret = new byte[1];
myRng.GetBytes(ret);
return ret[0];
}
Random r = new Random (intValue);
return r.Next();
请参阅 Random() 的构造函数:
为不同的随机对象提供相同的种子值的原因 每个实例生成相同的随机数序列
在Visual FoxPro中,你可以通过使用种子值调用一次RAND(),然后在后续调用中省略种子来重复生成相同的随机数序列:
RAND(mySeed)
RAND()
RAND()
在 C# 中,可以通过指定种子值作为 Random
构造函数的参数来执行类似的操作:
Random r = new Random (mySeed);
r.Next(intValue);
r.Next(intValue);
我对字符串值使用了GetHashCode
方法来播种Random
:
var s = "abcdefg";
var random = new Random(s.GetHashCode());
var hash = random.Next(10000, 99999));
以下是我通过一些测试用例获得的结果:
"abcdefg" => 43065
"abcdefg" => 43065
"defghij" => 62962
"qwerty" => 72764
"defghij" => 62962
"qwerty" => 72764
"abcdefg" => 43065