Я провожу викторину, в которой пользователь проверяет основные арифметические навыки. У меня проблема в том, что я не хочу создавать вопрос о делении, допускающий действительные числа. Я хочу, чтобы на все ответы были целочисленные ответы.

Как я могу случайным образом сгенерировать число от p до q, которое равномерно делится на n?

4
CanadaIT 23 Фев 2016 в 10:44

2 ответа

Лучший ответ

Идея состоит в том, чтобы сгенерировать два целых числа a and n, а затем вернуть a и c = a * n. Ответчик должен угадать, что такое n, и остерегаться деления на ноль !

Что-то вроде этого подойдет:

public KeyValuePair<int, int> GenerateIntDivisibleNoPair(int p, int q) {
    if (p <= 0 || q <= 0 || q <= p)
        throw Exception(); //for simplification of idea
    Random rand = new Random();
    int a = rand.Next(p, q + 1); //cannot be zero! note: maxValue put as q + 1 to include q
    int n = rand.Next(p, q + 1); //cannot be zero! note: maxValue put as q + 1 to include q
    return new KeyValuePair<int, int>(a, a * n);
}

Вы используете это так:

KeyValuePair<int, int> val = GenerateIntDivisibleNoPair(1, 101);
Console.WriteLine("What is " + val.Value.ToString() + " divide by " + val.Key.ToString() + "?");
6
Ian 23 Фев 2016 в 09:49

Я бы объявил случайное где-нибудь с глобальным доступом:

public static Random Rnd { get; set; }

Затем, когда вам нужно число, которое делится на другое, вы продолжаете генерировать число, пока не получите число, которое делится на ваш делитель:

if(Rnd == null)
{
    Rnd = new Random();

}

int Min = p; //Can be any number

int Max = q; //Can be any number

if(Min > Max) //Assert that Min is lower than Max
{
    int Temp = Max;
    Max = Min;
    Min = Temp;

}

int Divisor = n; //Can be any number

int NextRandom = Rnd.Next(Min, Max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.

while(NextRandom % Divisor != 0)
{
    NextRandom = Rnd.Next(Min, Max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.

}

Проверка использует функцию модуля%. Эта функция дает вам остаток от целочисленного деления.

Это означает, что если NextRandom% Divisor равен 0, то Divisor равномерно делится на NextRandom.

Это можно превратить в такой метод:

public static int GetRandomMultiple(int divisor, int min, int max)
{
    if (Rnd == null)
    {
         Rnd = new Random();

    }

    if(min > max) //Assert that min is lower than max
    {
        int Temp = max;
        max = min;
        min = Temp;

    }

    int NextRandom = Rnd.Next(min, max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.

    while (NextRandom % divisor != 0)
    {
        NextRandom = Rnd.Next(min, max + 1); //Add 1 to Max, because Next always returns one less than the value of Max.

    }

    return NextRandom;

}

Затем вы можете вызвать его с указанными вами переменными следующим образом:

int Number = GetRandomMultiple(n, p, q);

Примечание. Я добавляю единицу к значению Max из-за метода Next. Думаю, это ошибка в .Net. Значение Max никогда не возвращается, только Min..Max - 1. Добавление единицы компенсирует это.

1
WonderWorker 23 Фев 2016 в 09:40