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.0Rand()のシードを持つ は、まったく同じシードを持つ 4.0の と1234異なる場合があります。Rand()

古いインプリエンテーションに一致させる必要がある場合は、Visual Fox Pro が Rand 関数をどのように実行したかを調べる必要があります。ただし、同じ動作が必要で、同じ数値が必要ない場合は、文字列をハッシュして出力するだけです。

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

現在、これは暗号的に安全ではなく、異なるコンピューターで同じ番号を生成することが保証されていません (32 ビットと 64 ビットの間で異なる番号を返し、.Net ランタイムに基づいて異なるバージョンを返します (これは実際には両方GetHashCodeRandomそれ自体に適用されます!) )、データベースに保存しないでください!


どのコンピューター上にあるかに関係なく、同じ文字列から毎回同じ番号を取得する必要がある場合は、名前空間でRNGCryptoServiceProviderSystem.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() を 1 回呼び出し、その後の呼び出しでシードを省略することにより、同じ乱数シーケンスを繰り返し生成できます。

RAND(mySeed)
RAND()
RAND()

RandomC# では、シード値をコンストラクターへの引数として指定することで、同様のことができます。

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 に答える