2016-09-06 13 views
0

C#で乱数生成器を作成しています。私は、ユーザーが設定したシード値から名前を生成しようとすると、私が持っているトラブルが発生し実行時にシード値が定義され、変更されたランダムな出力を生成する

A WPF Window screenshot to illustrate

: 説明するために2015年

A WPFウィンドウのスクリーンショットのVisual Studioで記述されたWPFアプリケーションです実行時に以前は、ランダムな方法がありました。これは、ロジックを生成するすべての名前を提供し、静的として宣言され、プログラムが実行されている間ずっとシード値は変更されませんでした。これはうまくいき、[Generate Name]ボタンをクリックするたびに異なる出力を生成しました。

しかし、プログラムの実行時に組み込みのランダムメソッドのシード番号を変更する機能を追加したいと考えました。これを行うために、宣言を非静的に変更し、NamesGeneratorオブジェクトインスタンスの一部をランダムにする必要がありました。今度は、シード値を変更するたびに異なる名前が作成されますが、シード値を同じにしておくと、「Generate Name」ボタンをクリックするたびに同じ出力が作成されます。 (これはWPFウィンドウのスクリーンショットで見ることができます)。

私は、同じ出力を生成することができるプログラムです(したがって、私はシード値を使用しています)が、私は各シード値に対して(ランダムメソッドが静的だったときと同じように)一連の名前を使用できます。常に1つの名前だけが生成されるわけではありません。

私はこれも可能であるとは確信していません。そうであれば、私のリーグからはっきりと外れているので、私は助けを求めています。 Web上で同様の問題を検索しようとしましたが、役に立たないものは見つかりませんでした。ここで

、私は私のコードの一部を供給:私の問題を解決する方法について

class NamesGenerator 
{ 
    Random randomNumber; //I tried to have this static and non-static, to no avail 

...NAMES GENERATING CODE... 

    //SetSeedValue is called from the WPF Window and instantiates a new Random instance with seed value. 
    public void SetSeedValue(int seedValue) 
     { 
      randomNumber = new Random(seedValue); 
     } 
    public string GenerateName() 
    { 
     // determines if the name is male or female (unlike in English, there is a whole lot of differences in Russian related to this) 
     bool genderValue = equalDistributionMechanism(); // returns true if the name is masculine, false if it is not 

     string name; 

     name = makeTestName((randomNumber.Next(1, 2)), genderValue); //first name 

     name += " " + makeTestName((randomNumber.Next(1, 2)), genderValue) 
       + addSuffix((randomNumber.Next(1, 7)), gender: genderValue); //last name 

      return name; 
     } 

私の考えは乱数が既に与えられたシード値でインスタンス化し、そうならば、別のインスタンスを作成していないされているかどうかを確認することですSetSeedValueメソッドのrandomNumberの値を取得しますが、これをチェックする方法はわかりません。

A WPFコード私が使用しています:

public partial class MainWindow : Window 
{ 
    NamesGenerator namesGenerator = new NamesGenerator(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void GenerateNameButton_Click(object sender, RoutedEventArgs e) 
    { 
     int seedValue; 

     try 
     { 
      seedValue = int.Parse(SeedNumberTextBox.Text); 
     } 
     catch 
     { 
      MessageBox.Show("Not a valid seed number. Try again.", "Invalid Seed Number", MessageBoxButton.OK, MessageBoxImage.Warning); 
      return; 
     } 

     namesGenerator.SetSeedValue(seedValue); 
     AddNewName(namesGenerator.GenerateName()); 
    } 
} 

お時間をありがとうと、この:)を実現する方法上の任意の考え。

EDIT: HüseyinBurakKaradagからの要求のためにGenerateNameメソッドを追加しています。

+0

namesGeneator.GenerateName()メソッドを共有できますか? –

+0

あなたが何を求めているかは非常に不明です。シードを設定すると、生成された擬似乱数のシーケンスが、少なくとも部分的にはあなたが望むように変わってしまいます...サンプルから無関係なWPFコードをすべて削除し、問題を示すクラス/関数が1つだけありますか? –

+1

ボタンを押すたびに、テキストボックス内の数値にシード値を設定して、テキストボックス内の数値を変更しない限り、同じ 'ランダム'値を取得します。シード値のみを設定するボタンを追加するか、現在のシード値を保存し、変更があったときに新しいランダムを作成します。 –

答えて

1

あなたの質問を編集した前に、あなたが持っていた:

private void GenerateNameButton_Click(object sender, RoutedEventArgs e) 
    { 
     int seedValue; 

     try 
     { 
      seedValue = int.Parse(SeedNumberTextBox.Text); 
     } 
     catch 
     { 
      MessageBox.Show("Not a valid seed number. Try again.", "Invalid Seed Number", MessageBoxButton.OK, MessageBoxImage.Warning); 
      return; 
     } 

     namesGenerator.SetSeedValue(seedValue); 
     AddNewName(namesGenerator.GenerateName()); 
    } 

をボタンが押されたたびに、シード値を同じ値に設定されていたので、(テキストボックスのテキストが変更された場合を除き、それはあります)。これにより、ランダムに同じ番号が何度も繰り返し生成されます。

シード値を設定し、シード値を[名前の生成]ボタンに設定しないボタンを追加することも、単一のボタンを保持して現在のシード値をキャッシュし、変更時に新しいランダムを作成することもできます。このように:

class NamesGenerator 
{ 
    Random randomNumber; 
    int currentSeed = -1; 

    public void SetSeedValue(int seedValue) 
    { 
     if (currentSeed == seedValue) 
      return; 
     currentSeed = seedValue; 
     randomNumber = new Random(seedValue); 
    } 
} 

テキストボックスのテキストをキャッシュして、各ボタンを押して解析する必要はありません。

関連する問題