这两天做一个程序需要将金额数值按照可选区间进行自动分配,考虑了许久,采用随机数的方法编写算法,代码如下,复制即可测试.
代码虽不是完美,但足以应付小程序.若有更好的方法,欢迎指点!
public class Main { /** * @param args */ public static void main(String[] args) { testRandDivide(); } public static void testRandDivide() { long t1 = System.currentTimeMillis(); int success = 0; int testTotal = 1000; for (int j = 0; j < testTotal; j++) { int min = 5; int max = 8; int summary = 12; // 创建一个用来存储结果数据的数组 int[] k = new int[summary / min]; // 数组中有效数据长度 int s = randDivide(min, max, summary, k); if (s > 0) { System.out.println("分配成功,可以使用数组k[s]了."); success++; } else System.err.println("本次分配未成功,请检查分配参数或重试一次!"); } System.out.println("分配成功率:" + success * 100.0 / testTotal + "%"); System.out.println("time:" + (System.currentTimeMillis() - t1) + "ms."); } /** * 将一个整数summary随机拆分为N个在min~max之间的整数之和,并将分配结果存储到数组k中 * 注意:min~max之间差越大,则越容易随机分配,反之,差越小,分配越困难,甚至无解 * eg:min:5,max:8,summary:20,可以看出5 * +5+5+5+5=20,6+6+8=20,7+7+6=20,5+7+8=20,但使用随机数5~8,可能 * 第一次取到8,第2次也取到8,接下来无论怎么分配,也不可能为20 */ private static int randDivide(int min, int max, int summary, int[] k) { Random rand = new Random(); int s = 0; int total = 0; for (int i = 0; i < summary / min; i++) { // 产生一个在min与max之间的随机数 int result = rand.nextInt(max - min + 1) + min; // 剩余数 int remainder = summary - total; // 如果剩余数在min与max之间,则跳出 if (remainder >= min && remainder <= max) break; if ((remainder - result) > 0) { k[i] = result; s = i; total += result; } } if ((summary - total) >= min && (summary - total) <= max) { s++; k[s] = (summary - total); } if ((summary - total) < min) { int r = (summary - total); // 使用随机数划分 randDivideRemainder(max, k, s, r, 1); } // 校验 int t = 0; for (int i = 0; i <= s; i++) { t += k[i]; } if (t != summary) { s = 0; } return s; } /** * d:控制随机分配深度,防止无解导致栈溢出 */ private static void randDivideRemainder(int max, int[] k, int s, int r, int d) { Random rand = new Random(); for (int i = 0; i <= s; i++) { int _max = (max - k[i]) < r ? (max - k[i]) : r; if (_max == 0) continue; int result = rand.nextInt(_max - 1 + 1) + 1; k[i] = k[i] + result; r = r - result; if (r == 0) break; } if (r > 0 && d <= 100) { randDivideRemainder(max, k, s, r, ++d); } } }
相关推荐
本篇文章主要介绍如何将一个整数S随机拆分成N个在指定范围[min, max]内的整数。该问题通常应用于统计学模拟、游戏开发等领域,对于实现数据的合理分配具有一定的实际意义。 #### 二、核心算法思想 要解决这个问题,...
定义一个数组`a`来存储结果,使用反向遍历的方式,每次将整数`n`除以10得到余数并存入数组,同时将`n`更新为其除以10的结果。当`n`变为0时,拆分完成。 3. 求整数的因子之和: 这个算法通过遍历从1到输入整数`n`,...
我们可以创建一个三维数组 m[i][j][0] 来存储每个顶点的最小值和最大值。其中,m[i][j][0] 代表从 i 到 j 的最小值,m[i][j][1] 代表从 i 到 j 的最大值。 我们可以使用递归函数 minmax(i, j, s) 来计算从 i 到 j ...
在Python编程语言中,NumPy库是一个至关重要的组成部分,它为高效地处理大型多维数据提供了支持。NumPy,全称为“Numerical Python”,它的核心是`ndarray`对象,这是一个用于存储同类型元素的多维数组。这个库极大...
这个程序接收一个正整数`n`,通过循环计算每个数字的和(`s`)和积(`t`)。它使用`n%10`获取当前位数,然后分别累加到`s`和`t`。当`n`不为0时,继续进行下一次循环。 2. **字符转换** (Upwr.c) 该程序读取用户输入的...
这个问题展示了如何使用`Rnd`函数生成0到1之间的随机数,并通过`Fix`函数将其转换为10到100之间的整数。通过`If...Then`语句,统计不同区间内的整数个数。 2. 计算随机整数的最大值、最小值和平均值: 在这个例子...
在给定的代码示例中,`@min`和`@max`分别存储了起始和结束日期的字符串格式,它们将在后续的查询中使用。 代码的核心部分在于创建一个动态SQL语句,利用`master.dbo.spt_values`系统表中的数字列生成日期范围。`spt...
- **问题定义**:给定一个包含n个元素的数组A,需要找出其中的最大元素和最小元素。 - **简单方法**:遍历数组,比较每个元素与当前已知的最小值和最大值,复杂度为O(n)。 - **分治思路**:当n=2时,一次比较即可...
其中a为1至9之中的一个数,项数也要可以指定。 import java.util.Scanner; class Multinomial{ public static void main(String[] args){ int a; //定义输入的 a int howMany; //定义最后的一项有多少个数字 ...
- 遍历数组,每遇到一个新元素就将其加入堆中,若堆的大小超过k,则弹出堆顶元素。 - 最终堆中的元素即为最小的k个元素。 #### 6. 腾讯排数 **知识点**:本题考查如何解决一种特殊类型的数学谜题。 **解题思路**:...
在上面的示例中,`dif`、`max`和`min`函数都接收三个整数参数,并返回一个整数值。 4. **函数的调用**:在函数调用时,会将控制权转移给被调用的函数,并且可以传递参数。例如,`main()`函数调用`dif()`函数计算三...
Numpy是Python编程语言中的一个核心库,专用于数值计算和大型多维数组处理。它在科学计算领域扮演着至关重要的角色,为高效的数据操作提供了强大的工具。以下是对Numpy的一些关键知识点的详细总结: 1. **数组对象...
2. **质数生成**:生成一定范围内的所有质数,并存储在一个数组或列表中。 3. **拆分逻辑**:遍历质数数组,寻找两个质数的和等于目标偶数的组合。 4. **用户交互**:可能包含输入框让用户输入要验证的偶数,以及...
- `input`函数用于从键盘接收用户输入的数据,例如在3-2题中通过`input('请输入一个三位整数:')`获取三位整数。 - `fix`函数用于截取变量的小数部分,返回整数部分。 - `rem`函数是取余运算,可以得到两个数相除...
在Python的科学计算领域,NumPy是一个不可或缺的库,它为高效处理大型多维数组和矩阵提供了强大的支持。本练习集“numpy_practice”旨在帮助用户深入理解和掌握NumPy的功能和用法,无论你是初学者还是希望提升技能的...
【numpy】是Python编程语言中的一个核心库,全称为Numerical Python,主要用于处理大型多维数组和矩阵。它为高性能科学计算提供了强大的工具,广泛应用于数据科学、机器学习、图像处理等领域。本压缩包包含的"100道...
- 维护一个最小价格变量min_price和一个最大收益变量max_profit。 - 遍历每一天的股票价格,更新min_price和max_profit。 - 输出最优解,包括买入天数、卖出天数和收益。 ### 总结 以上三个问题分别涉及到了数据...
\n- `pop()`: 随机删除并返回一个元素(集合非空时)。\n- `union(set2)`: 创建一个新的集合,包含两个集合的所有元素。\n- `intersection(set2)`: 创建一个新的集合,包含两个集合的交集元素。\n- `difference(set2...
Python的NumPy库是科学计算的核心库,它提供了强大的N维数组对象以及各种与之相关的工具。本资料主要探讨了Python NumPy的一些基础操作和结果展示。虽然标签中提到了"C#",但在这个主题下,我们将专注于Python的...