2016-09-06 90 views
0

我正在用C#編寫一個隨機名稱生成器。 這是寫在Visual Studio 2015年在運行時定義並更改種子值生成隨機輸出

WPF窗口截圖WPF應用程序來說明:

A WPF Window screenshot to illustrate

當我嘗試從由用戶設定的種子值的名字我有麻煩發生在運行時。之前,我使用了隨機方法,它提供了所有名稱生成邏輯,聲明爲靜態,並且種子值在整個程序運行時保持不變。這很好,每次單擊生成名稱按鈕時都會生成不同的輸出。

我想要的,但是,加改變的內置的隨機方法,程序運行時的種子數的功能。爲了做到這一點,我必須將聲明更改爲非靜態,並使Random成爲NamesGenerator對象實例的一部分。現在,每當我更改種子值時,都會創建一個不同的名稱,但是當我離開種子值時,每次單擊「生成名稱」按鈕都會創建相同的輸出。 (你可以在WPF窗口截圖中看到這個。)

我試圖結束的是一個程序,可以生成相同的輸出(因此我使用種子值),但我希望每個種子值有一組可用的名稱(就像隨機方法是靜態的時候那樣),而不是一直生成一個名字。

我不知道這甚至有可能,如果是,它顯然是從我的聯賽,現在,這就是爲什麼我要求幫助。我試圖在網上搜索類似的問題,所以我找不到任何有用的東西。

在這裏,我提供我的一些代碼:

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; 
     } 

我如何解決我的問題是檢查是否randomNumber已經被實例化給定seedValue,如果是,不創建另一個實例思想在SetSeedValue方法中的randomNumber,但我不知道如何檢查這一點。

一個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()); 
    } 
} 

感謝您的時間,並就如何做到這一點:)任何想法。

編輯: 由於來自HüseyinBurakKaradag的請求添加GenerateName方法。

+0

可以分享namesGeneator.GenerateName()方法嗎? –

+0

非常不清楚你在問什麼。設置種子將改變生成的僞隨機數字的序列,這似乎至少部分是你想要的......你能從你的示例中刪除所有不相關的WPF代碼,並且只有一個類/函數來演示你的問題? –

+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()); 
    } 

所以,每次按下按鈕時,種子值被設置爲相同的值(除非該文本框的文本改變了,那是)。這會導致Random重複生成相同的編號。

您可以添加一個按鈕,設置種子值,而不是設置在生成名稱按鈕的種子值,或者如果你想保持單一按鈕,然後緩存當前種子值,而只創建一個新的隨機當它改變。像這樣:

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

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

或緩存文本框的文本,所以你不必分析它的每個按鈕按下。