【问题标题】:How to fill an array with random generated numbers in c#如何在c#中用随机生成的数字填充数组
【发布时间】:2017-09-08 11:54:00
【问题描述】:

本周我开始了我的 C# 实习开发人员职业生涯。 有一个练习,我应该为骰子程序编写一个 c#-console 代码。 程序的规格是:

要求用户输入掷骰子的频率 对于骰子的每只眼睛/数量,结果必须以 % 显示 比如:骰子掷出 1 次大约 3% 的 x 次。 2 被骰子掷出 7% 的 x 次 依此类推..直到 6 。 因为我是 C# 的新手,这就是我走了多远:

   var dict = new Dictionary<int, int>();

        foreach (var value in array)
        {
            if (dict.ContainsKey(value))
                dict[value]++;
            else
                dict[value] = 1;
        }

        foreach (var pair in dict)
            Console.WriteLine("Die Zahl {0} ist {1} mal vorhanden.", pair.Key, pair.Value);
        Console.ReadKey();

        Random diceRandom = new Random();
        int rollDice = diceRandom.Next(1, 7);
        Console.WriteLine(diceRandom);


        //Console.WriteLine("Es wurde eine:" + rollDice + "gewürfelt" );

        for (int i = 1; i <= 10; i++)
        {
            List<int> liste = new List<int>();
            var ausgabe = liste.Select(zahlen => rollDice % 2 == 0).ToList();
            rollDice = diceRandom.Next(1, 7);
            Console.WriteLine("Es wurde eine  "  + rollDice + "  gewürfelt.");
            Thread.Sleep(50);

我的问题,我还没弄清楚如何要求用户输入 骰子多久掷一次? 以 % 为单位的输出的第二件事不应该是一场大戏,因为我以某种方式得到了它,而第一个代码是该规范解决方案的开始。 这是我的第一次练习。

谢谢,L.J.

【问题讨论】:

标签: c# arrays string random


【解决方案1】:

为了简单起见,我接受了重建您的代码的屈膝礼。

我使用Console.ReadLine 从用户那里获取滚动次数。

Console.WriteLine("How many times should the dice be rolled ?");
int numberOfRolledTimes = int.Parse(Console.ReadLine());
var diceRandom = new Random();

var numberAndTimesArray = new int[6];
for (int i = 0; i < numberOfRolledTimes; i++)
{
    var rolledResult = diceRandom.Next(1, 7);
    numberAndTimesArray[rolledResult - 1]++;
}

for (int i = 0; i < 6; i++)
{
    double precentage = 100.0*numberAndTimesArray[i] / numberOfRolledTimes*1.0;
    Console.WriteLine("Dice result of {0} rolled {1} times. ({2}%)", i + 1, numberAndTimesArray[i], precentage);
}

输出:

【讨论】:

  • 您的回答很棒。看起来是这样。感谢您抽出时间并给出了实际的解释!
  • +1 -- 你甚至可以使用for (int i = 0; i &lt; numberAndTimesArray.Length; i++) 代替for (int i = 0; i &lt; 6; i++)。 -- 或者有一个const int sidesOfDie = 6; 并使用它来避免“神奇”数字。 (diceRandom.Next(1, 1 + sidesOfDie)) -- 和numberOfRolledTimes*1.0(大概是为了“加倍”)不应该是必要的,因为100.0*numberAndTimesArray[i] 已经“足够加倍”了。
  • 同意。他们两个我都可以使用(我不是幻数的粉丝),但为了简单起见,因为 OP 是初学者,我尝试尽可能直接地做到这一点。对于双重关注,我发现将变量 numberOfRolledTimes 视为整数的真正含义而不是强制它为 double 来缩短我的代码更合理。当我发现它没有贡献时,我停止尝试这样做。
  • @OrelEraki - 不确定我是否跟随。我以为你使用numberOfRolledTimes*1.0 来确保拥有double / double。虽然double / int 已经产生double。 (分子100.0*numberAndTimesArray[i] 已经是double,因为那是double * int,导致double)。
  • @Corak,我以为我从最后删除了1.0,我完全忘记了。
【解决方案2】:

您可以使用 for 循环或简单地使用 Enumerable.Range 创建 List&lt;int&gt; 或 int[] 或 Enumerable&lt;int&gt;。鉴于数组只保留了随机化他们的顺序女巫,您可以简单地使用.OrderBy 和一个由它排序的随机数:

Random rnd = new Random();
int start = 1, end = 6;
int[] results = Enumerable.Range(start, end).OrderBy(x=> rnd.Next()).ToArray();

【讨论】:

  • 感谢您的帮助。如果问题放错地方或..我将删除它。因为你的反对票。没有时间问这个必须问的问题。
【解决方案3】:
var numRollDices = int.Parse(Console.ReadLine());;
var randomGenerator = new Random();

var result = Enumerable
                .Range(0, numRollDices)
                .Select(i => randomGenerator.Next(1, 7))
                .GroupBy(n => n)
                .Select(n => new
                            {
                                Num = n.First(),
                                Count = n.Count(),
                                Percentile = ((n.Count() * 100) / numRollDices)
                            });

Console.WriteLine(string.Join($"{Environment.NewLine}", result.ToList()));

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 2011-01-23
    • 2011-01-17
    • 2020-08-07
    • 2021-03-14
    • 2013-12-29
    • 2017-06-04
    相关资源
    最近更新 更多