C#でこのタスクを実行する方法を知りたいです。例えば;
10個の質問があり、そのうち3個がユーザーに表示されて回答を入力できるようになっています。最初に開始する10個の質問が一意であると仮定して、プログラムに繰り返しのない(一意の)3つの質問を生成させるにはどうすればよいですか。
asp.netアプリケーションでロジックを使用していますが、次にページが更新されたときに同じ質問のセットを表示できるので、問題ありません。
C#でこのタスクを実行する方法を知りたいです。例えば;
10個の質問があり、そのうち3個がユーザーに表示されて回答を入力できるようになっています。最初に開始する10個の質問が一意であると仮定して、プログラムに繰り返しのない(一意の)3つの質問を生成させるにはどうすればよいですか。
asp.netアプリケーションでロジックを使用していますが、次にページが更新されたときに同じ質問のセットを表示できるので、問題ありません。
質問インスタンスのリストを使用し、ランダムに(インデックスで)1つ選択します。次に、それをリストから削除して繰り返します。そのようなもの;
static void Main(string[] args)
{
List<string> questions = new List<string>();
for (int i = 0; i < 10; i++)
questions.Add("Question " + i);
Random r = new Random();
for (int i = 0; i < 3; i++)
{
int nextQuestion = r.Next(0, questions.Count);
Console.WriteLine(questions[nextQuestion]);
questions.RemoveAt(nextQuestion);
}
}
アプローチの1つは、要素をランダムにシャッフルしてから、最初の3つを選択することです。C#でシャッフルする方法については、リスト<T>をランダム化します。
このアプローチは、大きなコレクションのリストから質問を削除するよりも優れています。最悪の場合(ランダム化が決定された場合、または単にひどく発生した場合)、削除のO(n)の複雑さにより、O(n ^ 2)まで大きくなる可能性があるためです。
class Questions
{
const int NUMBER_OF_QUESTIONS = 10;
readonly List<string> questionsList;
private bool[] avoidQuestions; // this is the "do-not-ask-question" list
public Questions()
{
avoidQuestions = new bool[NUMBER_OF_QUESTIONS];
questionsList = new List<string>
{
"question1",
"question2",
"question3",
"question4",
"question5",
"question6",
"question7",
"question8",
"question9"
};
}
public string GetQuestion()
{
Random rnd = new Random();
int randomVal;
// get a new question if this question is on the "do not ask question" list
do
{
randomVal = rnd.Next(0, NUMBER_OF_QUESTIONS -1);
} while (avoidQuestions[randomVal]);
// do not allow this question to be selected again
avoidQuestions[randomVal] = true;
// do not allow question before this one to be selected
if (randomVal != 0)
{
avoidQuestions[randomVal - 1] = true;
}
// do not allow question after this one to be selected
if (randomVal != NUMBER_OF_QUESTIONS - 1)
{
avoidQuestions[randomVal + 1] = true;
}
return questionsList[randomVal];
}
}
Questionsオブジェクトを作成し、questions.GetQuestions()を3回呼び出すだけです。