我正在用C#編寫一個隨機名稱生成器。 這是寫在Visual Studio 2015年在運行時定義並更改種子值生成隨機輸出
WPF窗口截圖WPF應用程序來說明:
當我嘗試從由用戶設定的種子值的名字我有麻煩發生在運行時。之前,我使用了隨機方法,它提供了所有名稱生成邏輯,聲明爲靜態,並且種子值在整個程序運行時保持不變。這很好,每次單擊生成名稱按鈕時都會生成不同的輸出。
我想要的,但是,加改變的內置的隨機方法,程序運行時的種子數的功能。爲了做到這一點,我必須將聲明更改爲非靜態,並使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方法。
可以分享namesGeneator.GenerateName()方法嗎? –
非常不清楚你在問什麼。設置種子將改變生成的僞隨機數字的序列,這似乎至少部分是你想要的......你能從你的示例中刪除所有不相關的WPF代碼,並且只有一個類/函數來演示你的問題? –
每次按下按鈕時,您都將種子值設置爲文本框中的數字,以便獲得相同的「隨機」值,除非更改文本框中的數字。添加一個按鈕來僅設置種子值或保存當前的種子值,並且只在更改時創建新的隨機值。 –