3

久しぶりに、最初の質問で尋ねたプログラムから結果を得ることができました。ID 番号として使用するリストに乱数を追加し、それを Excel にエクスポートします。しかし、データファイルで 2 つ以上のデータ メンバーを使用しているときに問題が発生しました。生成する乱数が 2 倍になり、プログラムがクラッシュします。

static Dictionary<string,Backup> getData()
{

    Dictionary<string, Backup> bDict = new Dictionary<string, Backup>();
    StreamReader reader = new StreamReader("/data/storedata.txt");

    while (!reader.EndOfStream)
    {

        string line = reader.ReadLine();
        string[] parts = line.Split(' ');

        string item = parts[0];
        string owner = parts[1];

        Random rnd = new Random();
        int test = rnd.Next(item.Length+10000);//For every 'item' a Random number is generated.(the +10000 is simply to produce a 4-digit number)

        //Console.WriteLine(test);//Testing 
        Backup BP = new Backup(item, owner,test);

        bDict.Add(test.ToString(), BP);//Adding to the Dictionary.

        //Console.WriteLine(string.Format("{0}, {1}, {2}", item, test, owner));

    }
    return bDict;
}//Read file, Grabed data and stored it in a List.

私がやろうとしていることは、2つの数字が同じである場合、代わりに新しい数字が生成される(または同じことを行う他の方法)という一種のチェックを行うことです。if ステートメントを試してみましたが、VS は何か他のものと比較するつもりかどうかを尋ね続けます。私は Stackoverflow で物事を見てきましたが、答えは私のコードで起こっていることに適合しません。任意のヘルプをいただければ幸いです。

FAQデータファイルには、最小/最大なしで500以上の「アイテム」があります

乾杯

4

3 に答える 3

4

Randomまず、オブジェクトの初期化をループのに移動します。while

Random rnd = new Random();
while (!reader.EndOfStream)....

http://msdn.microsoft.com/en-us/library/system.random.aspx

乱数の生成はシード値から始まります。同じシードを繰り返し使用すると、同じ一連の数値が生成されます。異なるシーケンスを作成する 1 つの方法は、シード値を時間依存にすることです。これにより、Random の新しいインスタンスごとに異なるシリーズが作成されます。デフォルトでは、Random クラスのパラメーターなしのコンストラクターは、システム クロックを使用してシード値を生成します。

これは基本的に、開始が速すぎる (つまり、loop何らかの形で) と、同じ値が得られる可能性が高いという意味です。

于 2013-10-14T09:46:46.527 に答える
2

rndwhile ループの外でインスタンス化します。次に、乱数が正しく動作する機会を与えます。あなたがしていることは、ジェネレーターを再初期化させることです。ジェネレーターの統計的特性を台無しにします。

しかし、あなたの特定の問題については、私はまったく使用rndしません。その理由は、乱数を重複させたくないからです。乱数を描画し、それが既に描画されているかどうかをテストすることは非効率的であり、時間の経過とともにますます非効率的になります (ちなみに、ジェネレーターの統計的特性も台無しになります: 期待される平均は正しいままですが、期待される分散はそれを超えて増加します1/12 以上のモーメントは不正確になります)。

シーケンスを特にランダムにする必要がない場合 (つまり、平均の期待値が 0.5 であることを気にしないなど) は、明確に定義された方法でさまざまなビットを整数で交換する関数を開発できます。 . 連続した数値を与えたその関数の出力をシーケンスとして使用します。

于 2013-10-14T09:46:20.823 に答える