1

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

我很抱歉标题令人困惑,让我澄清一下我的问题:

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

它应该以这种格式创建一个问题:

25% of 4616 = ?

要求是:

  • 百分比总是可以被 5 整除(没问题)
  • 数字(这里是 4616)必须在 100 到 9999 之间(也不是问题)
  • 数字和结果必须是整数(这是我的问题)

有没有什么快速的方法可以找到满足最后一个要求的随机数?

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

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

有没有更好的方法来解决我的问题?

编辑: 似乎我没有弄清楚我的问题是什么,我不想要双数,只想要整数。

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

7620 的 65% = ?

因为解 4953 也是一个整数。

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

4

4 回答 4

1

我只会选择一个百分比并从答案中向后工作以得出问题:

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

所以,选择你的百分比:

p = (5 * rand(1, 9)) / 100.0;

确保您的100 <= answer / p < 10000

answer = rand(100, p * 9999);

解决“未知”:

x = p / y
于 2013-09-13T03:37:23.663 回答
1

你是对的,分频器取决于p价值。所以,先pick 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)
于 2013-09-13T05:15:50.070 回答
1

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

因为p是一个百分比,它是 5 的倍数,0 to 100从那时起我们可以将其表示为p = 5a/100 = a/20where 0 <= a <= 20

因为x我们有这个约束100 <= x <= 999

先挑一个a满足的0 <= a <= 20

接下来我们选择一个x. 好吧,p * x = (a/20) * x要成为整数结果,我们只需要 20 来除a * x。好吧,我们知道20 | (a * x)("20 除 a * x") 当且仅当

j = (a * x) / 20 (<- j is some integer)
<=> j = (a * x) / (2^2 * 5^1)

既然我们有a,我们可以用它的素数分解来代替它:

j = (p1^e1 * p2^e2 * ... * pn^en) * x / (2^2 * 5^1)

现在意识到它a小于 20,所以它的素数分解可能非常简单,并且可能与素数分解“重叠”。例如,如果a = 5上面的等式简化为

j = x / 4

在这种情况下,很容易看出我们如何生成x将产生一个整数j(4 的倍数。尽管您也需要100 <= x <= 9999!)。所以“重叠”(即分子中的主要因素与分母相同)是非常有益的。这就是最大公约数发挥作用的地方。GCD(a, 20)是除a和的最大整数20。的主要因式分解GCD正是重叠。它还有一个很好的属性,一旦我们“移除”重叠,结果值:

j = b * x / c

b具有互质的好特性c。由此我们知道b * x / c当且仅当 是整数c | x

所以让GCD(a, 20) = k. 然后根据定义我们有a/k = b20/k = c,所以a/20 = b/c。因此让x = c * mwherem是一个整数。然后我们有:

100 <= m * c <= 9999
=> 100 / c <= m <= 9999 / c

所以我们可以做一个floor(rand(100 / c, 9999 / c))来生产你的m.

总结一下:

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 = 0实际上是一种极端情况,而且floor()不会给你一个完全均匀的分布。如果您需要涵盖这些内容,我可能会考虑一下并稍微调整一下答案。另外,欧几里得算法实现起来很简单,你可以查一下。哎呀,因为a < 20您可能只是对函数进行硬编码:)

编辑我第一次忘记c在摘要中定义。这是一个生成您在下面的反例的示例:

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

在这个例子中我们很方便,GCD(a, 20) = 5所以结果是m = y,但情况并非总是如此。

于 2013-09-13T09:13:09.163 回答
0

好的,感谢 roliu 我终于找到了解决方案。这就是我的最终解决方案的样子:

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

a = rand(1,20)

求最大公约数:

b = gcd(a,20)

在除以 20/gcd 的范围内创建一个随机数(如果您不知道原因,请参阅丹尼斯答案):

c = rand(floor(100/(20/b)),floor(9999/(20/b)))

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

x = floor(c * (20/b))

将数字乘以百分比得到解 y:

y = floor(x * (a/20))

将百分比转换为要打印的正确值:

p = a * 5

最终方程:

p % of x = y
于 2013-09-13T13:37:14.193 回答