Java 使用百分比时,查找一个创建另一个整数的随机整数

Java 使用百分比时,查找一个创建另一个整数的随机整数,java,math,Java,Math,已解决,有关我问题的精确解决方案,请参阅我的答案 我很抱歉标题混淆,让我澄清我的问题: 我的Java程序应该问一个带有百分比的数学问题 它应以以下格式创建一个问题: 25% of 4616 = ? 这些要求是: 百分比总是可以除以5(没问题) 数字(此处为4616)必须介于100和9999之间(也不是问题) 数字和结果必须是整数(这是我的问题) 有没有快速的方法来找到一个满足最后一个要求的随机数 我能想到的唯一解决方案是找到百分比,然后创建一个循环,在找到满足要求的随机数之前循环不会停止(

已解决,有关我问题的精确解决方案,请参阅我的答案

我很抱歉标题混淆,让我澄清我的问题:

我的Java程序应该问一个带有百分比的数学问题

它应以以下格式创建一个问题:

25% of 4616 = ?
这些要求是:

  • 百分比总是可以除以5(没问题)
  • 数字(此处为4616)必须介于100和9999之间(也不是问题)
  • 数字和结果必须是整数(这是我的问题)
有没有快速的方法来找到一个满足最后一个要求的随机数

我能想到的唯一解决方案是找到百分比,然后创建一个循环,在找到满足要求的随机数之前循环不会停止(在示例中,直到
number%4==0
为真)

但是这个循环可以运行数千次,直到找到正确的数字

有更好的方法解决我的问题吗

编辑: 似乎我没有弄清楚我的问题是什么,我不想要两个数字作为结果,只有整数

例如:如果我的百分比是65%,那么一个可能的问题是

7620的65%=

因为解4953也是一个整数


我想找到一个介于100和9999之间的随机数,它是一个整数,作为等式p*x=y的结果,它有一个整数。

我只需选择一个百分比,然后从答案中向后计算即可得出问题:

p * x = answer | 0 < p < 100, p = 5k, 100 <= x < 10000

确保您的
100正确,分隔符取决于
p
值。因此,首先选择
p
,然后使用它计算除法器以选择范围内的随机数:

For 5% it should be dividable by 20 (5/100 = 1/20)
For 10% it should be dividable by 10 (10/100 = 1/10)
For 15% it should be dividable by 20 (15/100 = 3/20)
For 20% it should be dividable by 5 (20/100 = 1/5)
For 25% it should be dividable by 4 (25/100 = 1/4)
For 30% it should be dividable by 10 (30/100 = 3/10)
...
您可以通过减少分数
p/100
并选取分母来计算它

下面的答案不正确

看起来您必须从100-9999范围内选择可除以20的数字

answer = x * p/100 = x * k/20 (since p is dividable by 5)
k = rand(1,494)
x = 100 + 20*k
p = 5*rand(1,20)

p
为百分比(分子,即25%),
x
为初始值,
y
为结果整数


由于
p
是5的倍数,从
0到100
,因此我们可以将其表示为
p=5a/100=a/20
,其中
0好的,多亏了roliu,我终于找到了一个解决方案。
我的最终解决方案是这样的:

创建一个介于1和20之间的随机数(因为百分比可以除以5):

查找最大公约数:

b = gcd(a,20)
在除以20/gcd的范围内创建一个随机数(如果不知道原因,请参见denis答案):

将随机数乘以20/gcd,得到一个范围内的数字,即x:

x = floor(c * (20/b))
将数字乘以百分比,得到解y:

y = floor(x * (a/20))
将百分比转换为要打印的正确值:

p = a * 5
最终方程式:

p % of x = y

@sbat这将不起作用,百分比与除法不同。例如:94*95=8930,但8930*0,95=8483,5(双精度,无整数)这并不能解决我的问题,我试图在我的原文中澄清我的问题question@Lotzki哎呀,百分比的计算确实是错的。将编辑以修复它。这应该是唯一的问题,虽然(除了伪代码)再次,这只是数学方程,这不会解决我的问题。查看我的答案和被接受的答案是的,我也考虑过,但这并不能涵盖所有可能的解决方案。@Lotzki你能想到任何没有涵盖的例子吗?你是对的,你必须根据
p
值选择除法器,更新我的答案这非常有帮助,但是缺失的部分是最大公约数函数,正如在另一个回答中提到的谢谢,最大公约数是我想不起来的缺失部分!我会接受这个答案,尽管代码有点混乱,不能正确处理我的问题。但是gcd做到了,看我的答案。@Lotzki它有点复杂,但它只是代数操作,以使公式尽可能简单。(我想证明你可以使用代数+约束并得出答案)。我忘了在我的总结中发布
c
的定义,也忘了用
p
除以100。我添加了这一点,并通过一个示例向您展示了公式应该是有效的。查看您的答案,您的计算与上面的几乎相同(尽管您使用了不同的表示法),但您有
y=floor(x*a/20)
。请注意,
a/20=5a/100=p/100
这就是我现在拥有的:)
j = x / 4
j = b * x / c
100 <= m * c <= 9999
=> 100 / c <= m <= 9999 / c
a = rand(0, 20)
p = 5*a
c = 20 / GCD(a, 20)
m = floor(rand(100 / c, 9999 / c))
x = c * m
y = (p / 100) * x
a = 5
p = 25
c = 20 / GCD(5, 20) = 20 / 5 = 4
m = some integer in [25, 2500). In this case so we randomed 879
x = 3516
y = 879
a = rand(1,20)
b = gcd(a,20)
c = rand(floor(100/(20/b)),floor(9999/(20/b)))
x = floor(c * (20/b))
y = floor(x * (a/20))
p = a * 5
p % of x = y