О функции автоматического заполнения идеальным числом

#c#

#c#

Вопрос:

Я должен создать программу, которая имитирует турнир по пению. Я закончил вопрос (почти), но мне нужна более реалистичная функция, которая заполняет от 1000 до 20 человек в массиве.

Я пытался выполнить бесконечный цикл до достижения успеха, но это занимает много времени, поэтому я удалил его, и я попытался заполнить random значением (0, 1001-(количество голосов до сих пор)), но, к сожалению, большинство голосов достается первым двум, и тогда у всех были бы нули.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp0
{
    class Program
    {
        static void Main(string[] args)
        {

            int[] A = new int[20];
            Random rnd = new Random();
            int jmo3 = 0;
            for (int i = 0; i < A.Length; i  )
            {
                if (i == A.Length - 1) 
                    A[i] = 1000 - jmo3; // so it can fill the last spot with the rest of the votes
                else
                {
                    A[i] = rnd.Next(0, 1001 - jmo3);
                    jmo3  = A[i];
                }
            }
        }
    }
}
  

Мне нужно, чтобы числа были нормальными с такими же шансами 20-го парня выиграть, как и у 1-го 🙂

Комментарии:

1. Я не уверен, что все понимаю, скажите мне, если я ошибаюсь. У вас есть 20 исполнителей (столько-то int[20] ) и 1000 голосов? Вы хотите, чтобы эти 1000 голосов были распределены между 20 исполнителями? Что-то вроде (для 5 исполнителей) { 197, 201, 194, 199, 209 }?

2. Да, какова цель вашей программы? Кто победитель? В чем проблема?

3. Итак, выберите случайное число между 0 и максимальным индексом вашего A массива (19 прямо сейчас) и увеличьте это местоположение массива (целое число). Повторите 1000 раз. Теперь вы собрали 1000 случайных голосов «да»? Если вы имеете в виду, пока кто-то не получит 1000 голосов, делайте выбор до тех пор, пока местоположение массива, которое вы только что увеличили, не станет равным 1000.

4. Пожалуйста, поясните, что вы имеете в виду под «реалистичной функцией, которая заполняет от 1000 до 20 человек». Что вы имеете в виду под реалистичным (что делает это нереалистичным)? У вас есть 1000 чего и 20 чего? «от 1000 до 20 человек» неоднозначно.

Ответ №1:

Для случая, когда вы хотите 1000 голосов между всеми записями в A

 int[] A = new int[20];
Random rnd = new Random();

// repeat for 1000 votes
for (int i = 0; i < 1000; i  )
{
    // select a random singer (by his index)
    int index = rnd.Next(0, A.Length);
    // add one vote for this singer
    A[index]  ;
}
  

Для случая, когда вы хотите продолжать голосование до тех пор, пока одна запись в A не станет 1000

 int[] A = new int[20];
Random rnd = new Random();
int index;

// repeat
do
{
    // select a random singer (by his index)
    index = rnd.Next(0, A.Length);
    // add one vote for this singer
    A[index]  ;
}
// until one singer has 1000 votes
while(A[index] < 1000)
  

Или вы имели в виду что-то совсем другое?

Ответ №2:

Я не понимаю класс C #, который начинается не с принципов ООП.

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

Существует массив с именем Votes , который содержит общее количество голосов, полученных каждым участником. Чтобы проголосовать за кого-то, увеличьте значение в массиве. Сделайте это 1000 раз, и вы получите 1000 голосов, распределенных между участниками.

 public class Contest
{
    static readonly Random rng = new Random();

    public Contest(int n_participants)
    {
        this.Votes = new int[n_participants];
    }
    public int Participants => Votes.Length;
    public int[] Votes { get; }
    public int TotalVotes => Votes.Sum();

    public void VoteFor(int index)
    {
        this.Votes[index]  = 1;
    }

    public void VoteRandom()
    {
        int index = rng.Next(0, Votes.Length);
        VoteFor(index);
    }
}

static class Program
{
    static void Main(string[] args)
    {
        // Singing contest with 20 participants.
        var singing_contest = new Contest(20);
        // Gather 1000 random votes
        for (int i = 0; i < 1000; i  )
        {
            singing_contest.VoteRandom();
        }

        // Tally up the votes
        for (int i = 0; i < singing_contest.Participants; i  )
        {
            Console.WriteLine($"Participant# : {i 1}, Votes = {singing_contest.Votes[i]}");
        }
        Console.WriteLine($"Total Votes = {singing_contest.TotalVotes}");

        Console.WriteLine("Press [Enter] to exit.");
        Console.ReadLine();
    }
}
  

scr