如何将百分比计算为指数级数?
Posted
技术标签:
【中文标题】如何将百分比计算为指数级数?【英文标题】:How to calculate a percentage as an exponential progression? 【发布时间】:2019-07-30 19:09:19 【问题描述】:我想做的很简单,但我想不出它的数学和代码。
我有一个百分比,我在控制台中显示为每个渐进步骤的新数字。所以我知道每一步的确切百分比 1-100。假设一个不断的进展,我想要的是只显示某个指数函数上的数字:
而不是显示:
1,2,3,4,5,6,7....100
我只想显示:
1,2,4,8,15,25,40,65,90,(100)
或者类似的东西。这个想法是显示初始活动,但很快就会降低垃圾邮件的百分比。
我该怎么做?我唯一能想到的是定义一个允许打印的固定数字数组(也许这是最好的解决方案?我觉得应该有一个更优雅的基于数学的解决方案)。嗯,或者也许使用指数函数/缓动曲线填充这样的数组。
添加一些关于如何获取百分比的信息:
for (int i = 0; i < batchjob.size(); i++)
int percent = 100 * i / batchjob.size();
log.debug("Progress: / = %", i, batchjob.size(), percent));
现在我尝试了以下方法:
final Set<Integer> progressDisplay = newHashSet(1, 2, 4, 8, 15, 25, 40, 65, 90, 100);
for (int i = 0; i < batchjob.size(); i++)
int percent = 100 * i / batchjob.size();
if (progressDisplay.contains(percent))
log.debug("Progress: / = %", i, batchjob.size(), percent));
但是,这会导致如下结果:
1,1,1,1,1,1,1,2,2,2,2,2,2,2,4,4,4,4,4,4,4,8,8,8 ,8,8,8,8...等
解决方案
我选择了接受的答案和固定数组的组合。我最终决定使用一个简单的数组,因为我可以更轻松地调整数字。
final int[] progressDisplay = 1, 3, 8, 20, 50, 75, 100;
int lastMatchingIndex = 0;
for (int i = 0; i < batchjob.size(); i++)
processBatchJob(batchjob.get(i));
int percent = 100 * i / batchjob.size();
if (progressDisplay[lastMatchingIndex] == percent)
log.debug("Progress: / = %", i, batchjob.size(), percent);
lastMatchingIndex++;
【问题讨论】:
当安装程序显示稳定的增量进度,直到它卡在 60% 一段时间,然后突然跳到 90%,这是一个错误,不应该尝试实施:P跨度> 我同意@thatotherguy,但这是在终端上:)(但也许跳跃不需要那么大) 【参考方案1】://initial exponential function check
int baseNum = 2;
final int exponent = 3;
int check = Math.pow(baseNum, exponent);
for(int x = 1; x <= 100; x++)
if(x == check)
System.out.println(x);
baseNum++;
check = Math.pow(baseNum, exponent);
这只是一个例子;您没有为完整的解决方案提供足够的信息。但是,您应该能够应用这个想法:您可以应用指数函数一次,然后在迭代时检查函数的输出,并且 - 如果相同 - 重新应用指数函数并重复。
【讨论】:
其实这很简洁,因为它还解决了重复数字的问题(111,222,444,888 等)。我试试看!【参考方案2】:如果你想保持简单,你总是可以只使用两个计数器,并根据每个循环迭代的计数器增加一个,这样每次跳转都会变大:
int j = 1, k = 1;
while (k < 100)
System.out.println(k);
j++;
k = k + j;
如果你想降低跳跃频率,你可以将k = k + j
更改为k = k + j / 2;
或类似的东西。如果您想更快地打印更少的数字,请提高j
的增加速度。专门根据最适合您的方式进行调整。
【讨论】:
【参考方案3】:您可以在 for 循环的增量参数中定义指数函数。以下是 x^2 的示例。
for(int x = 1; x <= 100; x*=2)
System.out.println(foo[x]); // 1/2/4/8/16/32/64
【讨论】:
以上是关于如何将百分比计算为指数级数?的主要内容,如果未能解决你的问题,请参考以下文章