Я хотел бы получить число от 5 до 250 из двух переменных в соответствии со следующим псевдокодом:
arg[1-19] * something = [5 - 250]
arg будет содержать значения (целые числа) в интервале [1 - 19]; something может быть любым целым числом.
Проблема в том, что я получаю тот же результат, используя разные комбинации arg и something:
arg: 1, something: 10 => result 10
arg: 2, something: 5 => result 10
Как я могу убедиться, что результат будет разным для любой пары arg и something?
Есть ли в Java математическая функция или функция для этого?
Ваш вопрос действительно непонятный. Ваш результат правильный, потому что вы делаете 1*10 или 2*5, что приведет к 10. Так в чем же ваша проблема?
Я даже не могу понять, каковы ваши входные данные и каков ваш желаемый результат. Напишите подпись метода, который хотите реализовать. Напишите javadoc этого метода.
Ваше "что-то" может быть (int)((new Random().nextInt(251) + 5) / arg), где arg - любой аргумент (в диапазоне 1-19).
@JedaiCoder Пожалуйста, не смейтесь надо мной (я понятия не имею о Java и не знаю, что делает nextInt()), но, похоже, что-то не так с вашим кодом. Предположим, что arg = 1, тогда ваш код теоретически может дать 255, не так ли?
Я голосую за повторное открытие этого вопроса. ИМХО, совершенно ясно, что он спрашивает: есть ли способ получить число от 5 до 250 путем умножения двух других чисел, когда одно из других чисел находится между 1 и 19, так что каждая другая пара другого числа дадут другой результат?




Если something может принимать больше значений 12, это невозможно, так как ваше входное пространство будет иметь размер не менее 19 * 13 = 247, тогда как ваше выходное пространство имеет размер 245.
Если something принимает значения меньше, чем 12, вы можете просто сделать: 19 *$something + arg + 4, предполагая, что вы сопоставляете значения something с интервалом [0,n].
Проголосовали за рассмотрение размера входного пространства ...
Не думаю, что у вас проблемы с программированием. Вместо этого, я думаю, вам следует сделать шаг назад и попытаться понять вашу проблему на математическом уровне. Рассмотрим уравнение
(1) a * b = C
для любого (произвольно выбранного) C, где a, b и C являются целыми числами.
Пока неa и b являются простыми числами оба, будет по крайней мере одна пара других a, b, которые также удовлетворяют уравнению. Доказательство очень простое, если задуматься на минуту:
Предположим, что a не является простым (доказательство будет таким же, если b не является простым). Тогда должно быть как минимум два целых числа p и a' (p не является одним по определению), чтобы
(2) a = p * a'
Теперь определим, что
(3) b' = p * b
Используя уравнения (2) и (3), вы можете переставить уравнение (1) следующим образом:
(4) C = a * b = (p * a') * b = a' * (p * b) = a' * b'
q.e.d
Здесь начиная с p != 1 (по определению - см. Выше), a != a' и b != b'.
Это означает, что у вас должны быть оба множителя a, b, если вы хотите гарантировать, что каждая пара (a, b) даст другой результат a * b.
Вы не сказали нам, чего на самом деле пытаетесь достичь, но, вероятно, есть лучшее решение, чем умножение двух целых чисел.
Например, если бы мы знали, что ваш something всегда меньше десяти (т. Е. 0, 1, ..., 9), вы могли бы использовать (arg * 10) + something (это только пример, демонстрирующий принцип; он дал бы значения между 10 и 199, учитывая ограничение для arg, которое у вас есть. упомянуто, поэтому на самом деле это не решение вашей проблемы; я выбрал эти числа, потому что наша десятичная система в основном работает именно так :-) и, следовательно, вы уже знаете об этом).
И, наконец, настолько тривиально, что это, возможно, не приходит в голову, вспомните, что a * b = b * a (умножение коммутативно, по крайней мере, для наших целых, действительных и иррациональных чисел и некоторых других, о которых я не смею упоминать). Применительно к вашей проблеме: arg * something = something * arg. Конечно, это все еще верно, даже если arg и something оба являются простыми. Вы неизбежно получите тот же результат, если поменяете значения arg и something. Это может быть приемлемым или неприемлемым для того, чего вы пытаетесь достичь.
Если ваша цель состоит в том, чтобы дать число "аргумент", вы возвращаете число "что-то", так что результат arg*something соответствует заданному интервалу, попробуйте следующее:
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(findNumber(2, 5, 250));
}
public static int findNumber(int arg, int min, int max) {
Random rand = new Random();
int randMin;
int randMax;
if (min%arg == 0){
randMin = min/arg;
} else {
randMin = (min / arg) + 1;
}
randMax = max/arg;
int result = rand.nextInt(randMax+1-randMin);
result = result + randMin;
return result;
}
Может помочь увидеть фрагмент кода.