簡體   English   中英

如何保持我的程序生成一個新的隨機數,直到找到以前未使用過的隨機數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM