2

我正在将 Visual Fox Pro 代码迁移到 C#。网

是什么让 Visual Fox Pro:根据文本字符串(在文本框中捕获)生成一个 5 位数字的字符串(“48963”),如果您始终输入相同的文本字符串,则该字符串始终为 5 位数字(不反向),我在 C# 中的代码。NET 应该生成相同的字符串。

有一些代码我不能在 dot.net Rand (int) 中播放

在 VisualFoxPro 中:

rand(intValue)

在 C# 中。网:

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
4

4 回答 4

4

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

如果您必须匹配旧的暗示,您将需要了解 Visual Fox Pro 是如何完成其​​ Rand 函数的。但是,如果您想要相同的行为,但不是相同的数字,您可以对字符串进行哈希处理,然后将其输出。

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

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


如果您每次都需要从同一个字符串中输出相同的数字,无论它在哪台计算机上,只需在命名空间中使用RNGCryptoServiceProvider 即可System.Security.Cryptography

//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];
}
于 2012-06-05T19:08:19.013 回答
3
Random r = new Random (intValue); 
return r.Next();

请参阅Random()的构造函数:

为不同的 Random 对象提供相同的种子值会导致每个实例产生相同的随机数序列

于 2012-06-05T18:51:55.773 回答
2

在 Visual FoxPro 中,您可以通过使用种子值调用 RAND() 一次重复生成相同的随机数序列,然后在后续调用中省略种子:

RAND(mySeed)
RAND()
RAND()

在 C# 中,您可以通过将种子值指定为Random构造函数的参数来执行类似的操作:

Random r = new Random (mySeed);  
r.Next(intValue); 
r.Next(intValue); 
于 2012-06-05T18:58:03.380 回答
1

我使用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
于 2012-06-05T18:57:26.670 回答