Как выбрать случайное число из целочисленного списка в c #? [dубликат]

Я создаю небольшое консольное приложение. Я составил список с тремя вопросами. Как я могу позволить программе случайно выбрать вопрос и распечатать его внутри консоли?

Я пробовал несколько разных кодов, но, по-видимому, я почему-то не работал. Это последний код, который я пробовал, который я получил от другого пользователя с этого сайта, но я получаю ошибки:

"The name 'string' does not exists in current context"

«Поскольку« Quiz.Questions.main () »возвращает void, возвращает ключевое слово не должно сопровождаться выражением объекта «

Вот последний фрагмент кода, который я пробовал:

class Questions
{
    public static void main()
    {
        var questions = new List<string>{
            "question1",
            "question2",
            "question3"};
        int index = Random.Next(strings.Count);
        questions.RemoveAt(index);
        return questions;

    }

}

Спасибо всем за ваши ответы. Я исправил свою проблему, создав массив вместо списка. Это мой код сейчас:

class Questions
{
    public static void main()
    {
        string[] questions = new string[3];
        questions[0] = "question1";
        questions[1] = "question2";
        questions[2] = "question3";
        Random rnd = new Random();
        Console.WriteLine(questions[rnd.Next(0,2)]);
    }
}
7
задан 11 October 2013 в 18:59

7 ответов

Вам нужен статус System.Console.WriteLine.

class Questions
{
    public static void main()
    {
        var questions = new List<string>{
            "question1",
            "question2",
            "question3"};
        int index = Random.Next(questions.Count);
        System.Console.WriteLine(questions[index]);

    }
}
4
ответ дан 15 August 2018 в 14:35
  • 1
    Также strings.Count следует заменить на questions.Count и Random.Next (...) новым Random (). Next (...). – Alexey Mitev 11 October 2013 в 17:45
  • 2
    Спасибо, Алексей. Исправленный. – Bill Gregg 11 October 2013 в 17:46
  • 3
    @AlexeyMitev: new Random().Next имеет ловушку, что он не будет создавать разные числа, если он будет вызван повторно через короткие промежутки времени. – Tim Schmelter 11 October 2013 в 17:59

Для других поисковиков преимущество: если вы хотите список истощения, чтобы вы могли использовать все предметы случайным образом, сделайте следующее:

//use the current time to seed random so it's different every time we run it
Random rand = new Random(DateTime.Now.ToString().GetHashCode());
var list = new List<string>{ "item1", "item2", "item3"};

//keep extracting from the list until it's depleted
while (list.Count > 0) {
    int index = rand.Next(0, list.Count);
    Console.WriteLine("Rand Item: " + list[index]);
    list.RemoveAt(index);
}
1
ответ дан 15 August 2018 в 14:35

Вы уверены, что хотите удалить вопрос и вернуть остальные вопросы? Если вы не только выбрали один? Что-то вроде этого:

public static void main()
{
    var random = new Random();
    var questions = new List<string>{
        "question1",
        "question2",
        "question3"};
    int index = random.Next(questions.Count);
    Console.WriteLine(questions[index]);
}
12
ответ дан 15 August 2018 в 14:35

Попробуйте что-то вроде этого

public static void main()
{
    var questions = new List<string>{
        "question1",
        "question2",
        "question3"};
    Random rnd = new Random();
    int index = rnd.Next(questions.Count)
    string question  = questions[index];
    questions.RemoveAt(index); // Are you sure you neex to remove?

    System.Console.WriteLine(question);
}

Там, где вы используете string вместо questions, есть опечатка. Кроме того, объект Random должен быть инициализирован.

3
ответ дан 15 August 2018 в 14:35

Что-то вроде этого может быть тем, что вы хотите:

private Random rng;
T PickRandom<T>(List<T> list)
{
    return list[rng.NextInt(list.Count)];
}

Вы можете вызвать его в своем списке, чтобы получить из него случайный элемент.

0
ответ дан 15 August 2018 в 14:35
«Имя« строка »не существует в текущем контексте»

Предполагаю, что вы хотите

int index = random.Next(questions.Count); // according to the lower-case random see last paragraph

вместо

int index = Random.Next(strings.Count);

Поскольку нет переменной с именем strings, и вы все равно хотите удалить один вопрос.

Кроме того, вы не можете вернуть что-то из метода void. Создайте тот, который возвращает список:

private Random random = new Random();
List<string> GetRemoveQuestion(List<string> questions)
{
        int index = random.Next(questions.Count);
        questions.RemoveAt(index);
        return questions;
}

Редактирование: последнее, но не менее важное, вы не можете использовать Random.Next. Это предполагает, что существует static Next метод в Random, что не так. Поэтому я показал выше, как вы создаете и используете экземпляр. Обратите внимание, что вы не должны создавать его сам, потому что он заселен с помощью текущего времени. Если вы назовете этот метод очень быстро, вы получите частое «случайное» значение.

Взгляните на msdn в разделе замечаний для более подробной информации.

1
ответ дан 15 August 2018 в 14:35
  • 1
    довольно уверен Случайный не имеет статического Следующий метод – Weyland Yutani 11 October 2013 в 17:47
  • 2
    @WeylandYutani: Спасибо, отредактировал мой ответ соответственно. – Tim Schmelter 11 October 2013 в 17:54

У вас есть пара незначительных ошибок.

Вам нужна ссылка на объект Rand. Вы смотрите на strings вместо questions. Вы удаляете элемент вместо его выбора.

Попробуйте следующее:

void Main()
{
    Random rand = new Random();
    var questions = new List<string>{
        "question1",
        "question2",
        "question3"};
    int index = rand.Next(questions.Count);
    return questions[index];
    // If you want to use Linq then
    // return questions.Skip(index).Take(1);
}
0
ответ дан 15 August 2018 в 14:35

Другие вопросы по тегам:

Похожие вопросы: