#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();
}
}