在c#中创建骰子出现的频率表

本文关键字:频率 创建 | 更新日期: 2023-09-27 18:18:41

我是一个编程新手,目前正在学习c#。

我有两个骰子随机掷50次两个骰子的总数加在一起,得到每次掷出的总数。

我的问题是,我如何创建一个频率表来计算在50次骰子投掷结束时某个数字被滚动的次数。

下面是我想要达到的。掷出的每个数字计数表

1: |||
2: ||||
3: ||||||
4: |||||
5: ||||||||
6: ||

这是我到目前为止的代码,

class Program
{
    const int DICE_ROLLS = 51;
    static void Main(string[] args)
    {
        Random random = new Random();
        int[] firstDice = new int[DICE_ROLLS];
        int[] secondDice = new int[DICE_ROLLS];
        int diceSum = 0;
            for (int roll = 1; roll <= 50; roll++)
            {
                firstDice[roll] = GenerateNumber(random);
                secondDice[roll] = GenerateNumber(random);
                diceSum = firstDice[roll] + secondDice[roll];
                Console.WriteLine("ROLL {0}:  {1} + {2} = {3}", roll, firstDice[roll], secondDice[roll], diceSum);
            }
            Console.WriteLine();
            Console.WriteLine("~~~~~~~~~~~~~~~~");
            Console.WriteLine("Number Frequency");
    }
    static int GenerateNumber (Random random)
    {
        return random.Next(1, 7);
    }
}

在c#中创建骰子出现的频率表

试试这个:

const int DICE_ROLLS = 51;
static void Main(string[] args)
{
    Random random = new Random();
    int[] firstDice = new int[DICE_ROLLS];
    int[] secondDice = new int[DICE_ROLLS];
    int[] count = new int[6];
    int diceSum = 0;
    for (int roll = 0; roll <= DICE_ROLLS - 1; roll++)
    {
        firstDice[roll] = GenerateNumber(random);
        secondDice[roll] = GenerateNumber(random);
        diceSum = firstDice[roll] + secondDice[roll];
        Console.WriteLine("ROLL {0}:  {1} + {2} = {3}", roll + 1, firstDice[roll], secondDice[roll], diceSum);
    }
    Console.WriteLine();
    Console.WriteLine("~~~~~~~~~~~~~~~~");
    Console.WriteLine("Number Frequency");
    var allRolls = firstDice.Concat(secondDice).ToList();   
    for(var i = 1; i <= 6; i++)
    {
        Console.Write(i + ": ");
        for(var j = 0; j < allRolls.Count(c => c == i); j++)
            Console.Write("|");
        Console.WriteLine();
    }
}

static int GenerateNumber (Random random)
{
   return random.Next(1, 7);
}

给:

~~~~~~~~~~~~~~~~
Number Frequency
1: ||||||||||||||||||||
2: |||||||||||
3: ||||||||||||||||||
4: ||||||||||||||||
5: |||||||||||||||||||||
6: ||||||||||||||||

假设是6面骰子,Dictionary可能是一个不错的选择。

var rolls = new SortedDictionary<int, int> { {1,0}, {2,0}, {3,0}, {4,0}, {5,0}, {6,0} };
for(int i = 0; i < 50; i++)
{
   var first = Random.Next(1, 7);
   var second = Random.Next(1, 7);
   rolls[first]++;
   rolls[second]++;
   // Rest of rolling display code
}
// Header display code
foreach(var roll in rolls)
{
     Console.Write("{0}: ", roll.Key);
     for(int i = 0; i < rolls.Value; i++)
     {
         Console.Write("|");
     }
     Console.WriteLine();
}

你甚至可以很容易地定制它基于不同的侧面骰子生成初始字典值基于一个变量,如

int sides = 12;
var rolls = new SortedDictionary<int, int>();
foreach(var value in Enumerable.Range(1, sides))
{
    rolls.Add(value, 0);
}

你可以用Random.Next(1, sides)代替Random.Next(1, 7),并且有一个非常通用的程序来滚动骰子并计算它们的频率。

这行得通:

var rnd = new Random();
Console.WriteLine(
    String.Join(
        Environment.NewLine,
            Enumerable
                .Range(0, 50)
                .Select(n => rnd.Next(1, 7))
                .ToLookup(x => x)
                .Select((xs, n) =>
                    String.Format("{0}: {1}", n + 1, new String('|', xs.Count())))));

我得到这个(例如):

1: |||||||
2: |||||||
3: |||||||||||
4: |||||||||
5: ||||||||
6: ||||||||