[英]How do I keep my program generating a new random number untill it finds one that has not been used before?
好的,標題可能會引起誤解,但是我無法真正為我的問題提供更好的解釋。 我正在嘗試創建一個程序,該程序接受一個名字數組和一個姓氏數組,並將它們組合成一個全名數組。 這里的問題是,我試圖確保同一名稱不會出現兩次,因此,如果firstname [randomindex]和lastname [randomindex]的組合已經在全名數組中,它將重新滾動隨機數用於索引,直到找到未使用的組合。 到目前為止,我還停留在這一點:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _100randompersons
{
class Fyldefylde
{
private string[] firstnames;
private string[] lastnames;
private string[] fullnames;
private Random random;
public Fyldefylde()
{
firstnames = new string[10] { "Kim", "Allan", "Frank", "Lone", "Line", "Anne", "Per", "Bo", "Grethe", "Mette" };
lastnames = new string[10] { "Pedersen", "Nielsen", "Hansen", "Larsen", "Nygaard", "Harboe", "Bendix", "Højris", "Pilgaard", "Nyager" };
fullnames = new string[100];
random = new Random();
}
public string[] getFirstNames()
{
return firstnames;
}
public string[] getLastNames()
{
return lastnames;
}
public string[] getFullNames()
{
return fullnames;
}
public int getRandomIndex(int min, int max)
{
int randomnumber = random.Next(min, max);
return randomnumber;
}
public void fillFullNames()
{
for(int i = 0; i < fullnames.Length; i++)
{
getRandomIndex(0, 10);
while(fullnames.Contains(firstnames[getRandomIndex(0,10)] + " " + lastnames[getRandomIndex(0,10)]))
{
fullnames[i] = firstnames[getRandomIndex(0, 10)] + " " + lastnames[getRandomIndex(0, 10)];
}
}
}
}
}
提前致謝! :)
看來您只想使用全名的所有組合,所以為什么不這樣做呢?
for (int i = 0; i < firstnames.Length; i++)
{
for (int j = 0; j < lastnames.Length; j++)
{
fullnames[i*lastnames.Length + j] = firstnames[i] + " " + lastnames[j];
}
}
然后,如果您希望您的姓名以隨機順序排列,請運行一種方法以隨機排列姓名的順序
如果您想按隨機順序排列名稱,則可以始終執行以下操作
string[] firstnames = new string[10] { "Kim", "Allan", "Frank", "Lone", "Line", "Anne", "Per", "Bo", "Grethe", "Mette" };
string[] lastnames = new string[10] { "Pedersen", "Nielsen", "Hansen", "Larsen", "Nygaard", "Harboe", "Bendix", "Højris", "Pilgaard", "Nyager" };
string[] fullnames = new string[100];
List<int> indices = new List<int>();
for (int i = 0; i < firstnames.Length * lastnames.Length; i++)
{
indices.Add(i);
}
Random random = new Random();
for (int i = 0; i < firstnames.Length; i++)
{
for (int j = 0; j < lastnames.Length; j++)
{
int randomIndex = random.Next(indices.Count() - 1);
fullnames[indices[randomIndex]] = firstnames[i] + " " + lastnames[j];
indices.RemoveAt(randomIndex);
}
}
您可以使用簡單的HashSet來確保值是唯一的:
public void fillFullNames()
{
HashSet<string> newFullNames = new HashSet<string>();
while (newFullNames.Count != fullnames.Length) {
newFullNames.Add(firstnames[getRandomIndex(0, 10)] + " " + lastnames[getRandomIndex(0, 10)]);
}
fullnames = newFullNames.ToArray();
}
最好的選擇是生成代表每個可能組合的fullname
的原型版本,然后如果需要隨機輸出則將其改組:
Random rnd = new Random();
string[] random_full_name = fullname.OrderBy(x => rnd.Next()).ToArray();
然后,您可以連續讀取此新陣列,以得到沒有重復的隨機樣本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.