【问题标题】:migrate method Rand(int) Visual Fox Pro to C#.net迁移方法 Randint) Visual Foxpro 到 C#.net
【发布时间】:2012-06-09 22:26:20
【问题描述】:

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

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

我想迁移以下代码(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

谢谢!

【问题讨论】:

标签: c# asp.net .net foxpro visual-foxpro


【解决方案1】:

如果您真的需要获得与描述完全相同的行为,请将 VFP RAND 调用封装在 COM dll 中并从 .net 调用它。

似乎是一个奇怪的设计,但我猜那是你的遗留系统。

【讨论】:

    【解决方案2】:

    相当于

    Rand(vcad)
    

    是

    (new Random(vcad)).Next();
    

    相当于

    x = Rand(seedValue)
    y = Rand()
    

    是

    Random r = new Random(seedValue);
    x = r.Next();
    y = r.Next();
    

    但是,如果这些等效语句实际上在 VFP 中产生与在 c#.Net 中相同的结果,那么您应该认为自己非常幸运。底层实现必须相同,这让我非常惊讶。如果它们不能产生相同的结果,而这是您的要求,那么您的任务就是找出 FoxPro 的 Rand 函数的内部实现是什么,并在 c# 代码中复制它。

    如果 vcad 的值范围被限制在某个范围内,最简单的解决方案是使用 VFP 生成查找值表并将其用于 c# 转换。

    【讨论】:

    • C#和VFP中的Random方法不等价,需要在VFP中进行应用才能得到相同的结果。
    【解决方案3】:

    正如我在您的另一个问题 http://foxcentral.net/microsoft/vfptoolkitnet.htm 中发布的那样,.net 的 VFP 工具包可能具有相同的 rand 生成器功能

    【讨论】:

    • 该工具包确实定义了 Rand 函数。它只是调用普通的 c# Random.Next 函数。依赖任何 API 的随机数生成实现在所有未来版本中返回相同的序列,这似乎是一个设计缺陷(在用户的代码中)。
    • 如斧头兰德函数(Visual Fox Pro Toolkit.NET)所定义的: public static double Random (int nSeed) { R = new System.Random System.Random (nSeed); r.Next return();如果 nSeed = 971 在 VFP 6 中此方法返回 0.70 在 C# 中此方法返回 2627119 处理方法 Random.NextDouble(nSeed) 返回 0.0012234761202029 我召集你不能重现此方法或导入库到。我最后的办法是使用一个接受参数的应用程序,但不要在 Visual Fox Pro 6 中这样做,所以我把这个研究留在这里,谢谢
    【解决方案4】:

    您的解决方案实际上可以像 C# .net 4.0 中的两个现有方法一样简单

    public int MyRandomFunction(string seedString)
    {
        int hashCode = seedString.GetHashCode(); // Always returns the same integer based on a string
        Random myGenerator = new Random(hasCode);
        return myGenerator.Next(10000, 99999); // Returns a number between 10000 and 99999, ie 5 digits
    }
    

    你总是会得到相同的初始值,因为你总是从相同的种子开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      相关资源
      最近更新 更多