2017-01-19 9 views
2

さて、このタイトルは誤解を招くかもしれませんが、私は実際に自分の問題をよりよく説明することができませんでした。私は最初の名前の配列と姓の配列をとるプログラムを作成しようとしており、これらの名前を完全な名前の配列にまとめています。ここで問題となるのは、同じ名前が2回発生しないようにすることです。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)]; 
       } 
     } 
    } 

} 
} 

ありがとうございます!

Random rnd = new Random(); 
string[] random_full_name = fullname.OrderBy(x => rnd.Next()).ToArray(); 

あなたは、あなたのを達成するために連続して、この新しい配列を読み出す::)

+2

理由それはランダムですか?すべての組み合わせを反復するネストされた 'for 'でフルネームを入力するだけです – prof1990

+0

固定数のランダムな組み合わせまたはすべての可能な組み合わせを生成しようとしていますか?前者では無作為で、後者では無意味です。 – InBetween

答えて

3

あなたは完全な名前のすべての組み合わせを作成するように見えますが、なぜそうしないのですか?あなたはランダムな順序であなたの名前をしたい場合は、

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

仲間に感謝します、私は多分私が必要以上に自分自身のために複雑にしたと思う! – sunero4

+0

私はこの回答に投票したので奇妙です。 :) – Ben

+0

私はあなたがi * lastNames.Length :)を意味すると思う(fullnames [i * i + j]) – Hristo

1

あなたの最善の策は、あなたがランダム化された出力をしたい場合ことをシャッフルし、その後、すべての可能な組み合わせを表しfullnameのプロトタイプ版を生成することです重複のないランダムサンプル。

+0

助けてくれてありがとう!私はBensがちょうどネストされたforループを使用していることを見た後、私は必要以上に自分自身をより難しくしましたが、今私は別の時間のように何かをする必要がある場合、これがオプションであることを知っています:) – sunero4

+0

これは、リストをシャッフルする最も効率的な方法ではありません。このトピックをチェックしてください:http://stackoverflow.com/questions/273313/randomize-a-listt –

2

あなたは値が一意であることを確認するために、単純な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(); 
    } 
+0

おかげさまで、私はC#とプログラミング一般にはかなり新しいので、私はHashsetコマンドに慣れていませんでしたが、私はそれを調べます:)! – sunero4

+1

HashSet.Add(T値)は、新しい値がまだHashSetに存在しない場合にのみtrueを返します(要素を追加します)。 –

関連する問題