I'm migrating a Visual Fox Pro code to C #. NET
What makes the Visual Fox Pro:
generates a string of 5 digits ("48963") based on a text string (captured in a textbox), if you always enter the same text string will get that string always 5 digits (no reverse), my code in C #. NET should generate the same string.
I want to migrate the following code (Visual Fox Pro 6 to 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
outputs:
vcad = 1 return: 99905 vcad = 2 return: 10077 vcad = thanks return: 17200
thks!
as i posted in your other question http://foxcentral.net/microsoft/vfptoolkitnet.htm the VFP toolkit for .net might have the same rand generator function
Your solution could really be as simple as two existing methods in 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
}
You will always get the same initial value, because you are always starting with the same seed.
The equivalent of
Rand(vcad)
is
(new Random(vcad)).Next();
The equivalent of
x = Rand(seedValue)
y = Rand()
is
Random r = new Random(seedValue);
x = r.Next();
y = r.Next();
However, you should consider yourself extremely lucky if these equivalent statements actually produce the same results in VFP as in c#.Net. The underlying implementations would have to be the same, which would surprise me greatly. If they don't produce the same results, and that is a requirement for you, you're left with the task of finding out what FoxPro's internal implementation of the Rand function is, and duplicating that in c# code.
If the range of values for vcad is constrained within some range, the simplest solution would be to use VFP to generate a table of lookup values and use that in your c# conversion.
Encapsulate the VFP RAND call in a COM dll and call it from .net if you really need to get the exact same behaviour as described.
Seems an odd design, but that's legacy systems for you I guess.