有一种方法可以匹配Visual Fox Pro和C#的方法RAND(INT).网

本文关键字:方法 Pro RAND INT Fox 一种 Visual | 更新日期: 2023-09-27 18:36:16

我正在将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

有一种方法可以匹配Visual Fox Pro和C#的方法RAND(INT).网

.

NET 中的 Rand 不能保证在主要修订号之间相同,因此 2.0 中种子为 1234Rand()可能与 4.0 中种子完全相同的Rand()不同。

如果你必须匹配旧的 implintation,你需要找出 Visual Fox Pro 是如何实现其 Rand 功能的。但是,如果您想要相同的行为,但不是相同的数字,您可以对字符串进行哈希处理,只需输出即可。

Random r = new Random (myTextBox.Text.GetHashCode()); 
return r.Next();

现在这在加密上是不安全的,也不能保证在不同的计算机上生成相同的数字(它返回 32 到 64 位之间的不同数字,以及基于 .Net 运行时的不同版本(这实际上适用于GetHashCodeRandom本身!)),所以不要将其存储为数据库!


如果您每次都需要从同一字符串中使用相同的数字,无论它在哪台计算机上,只需在 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