C#: Как назначить случайные значения int переменным? - PullRequest
0 голосов
/ 29 марта 2020

Я создал класс игры в кости, включающий метод, который использует random.next для определения случайного значения типа int от 1-6.

Fairdice.cs:

 class FairDice
{

    //defining variable and property
    private Random rnd;
    public int Current { get; private set; }
    public FairDice()
    {
        rnd = new Random(Guid.NewGuid().GetHashCode());
        Current = 0;
    }

    public int FRoll()
    {
        Current = rnd.Next(1, 7);
        return Current;
    }

RollDice.cs с возможностью печати oop.

static class RollDice
{
    public static void Roll(this int count, Action action)
    {
        for (int i = 0; i < count; i++)
        {
           action();
        }
    }
}

Program.cs включает этот код, который выводит 5 случайных значений в диапазоне 1-6:

FairDice fd = new FairDice();
                    5.Roll(() => Console.WriteLine("Dice: " + fd.FRoll()));

Проблема: I wi sh для присвоения случайных значений каждой переменной, сохранения и сохранения их в списке или массиве для дальнейшего использования.

уточнение:

Допустим, оно печатает числа: 1, 2, 3, 4, 5 - тогда я wi sh назначу каждому значению переменную: a = 1, b = 2, ... f = 5.

и / или просто сохраню значения в массиве {1, 2, 3, 4, 5}

Есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 29 марта 2020

Как только результаты броска попадают в массив, вы можете извлекать присваиваемые переменные по мере необходимости.

class FairDice
{
    private static int _seed;
    private static ThreadLocal<Random> threadLocal = new ThreadLocal<Random>
        (() => new Random(Interlocked.Increment(ref _seed)));

    static FairDice()
    {
        _seed = Environment.TickCount;
    }

    private static Random Rng { get { return threadLocal.Value; } }

    public int Roll()
    {
        return Rng.Next(1, 6);
    }
}

static class RollDice
{
    public static int[] Roll(this int count, FairDice dice)
    {
        int[] values = new int[count];
        for (int i = 0; i < count; i++)
        {
            values[i] = dice.Roll();
        }
        return values;
    }
}

class Program
{
    static void Main(string[] args)
    {
        FairDice fd = new FairDice();
        int[] values = 5.Roll(fd);
        Console.WriteLine(String.Join(",", values.Select(x => x.ToString()).ToArray()));
    }
} 
0 голосов
/ 29 марта 2020

добавьте это к FairDice (строки с '*'):

class FairDice
*         private int[] returnedValues;
public int FRoll()
        {
            Current = rnd.Next(1, 7);
*            returnedValues[Current]++;
            return Current;
        }

*public void GetreturnedValues()
*        {
*            for (int i = 1; i < 7; i++)
*            {
*                Console.WriteLine("{0}: {1}", i, returnedValues[i]);
*            }
*        }

После этого добавления d.GetreturnedValues(); к вам Program.cs покажет, сколько раз различные значения были брошены.

0 голосов
/ 29 марта 2020

Если вы хотите сохранить значения, возвращаемые путем вызова FRoll, вы можете сделать что-то вроде этого:

FairDice fd = new FairDice();
var numbers = new List<int>();
5.Roll(() => numbers.Add(fd.FRoll()));  // Append the values to the list as we generate them
var firstNumberRolled = numbers[0]; // Access the values later
Console.WriteLine($"The first number rolled was {firstNumberRolled}");
...