- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在下面有一个函数(来自未得到答复的 previous question),它创建了一个包含 n 个值的数组。数组的总和等于$max。
function randomDistinctPartition($n, $max) {
$partition= array();
for ($i = 1; $i < $n; $i++) {
$maxSingleNumber = $max - $n;
$partition[] = $number = rand(1, $maxSingleNumber);
$max -= $number;
}
$partition[] = $max;
return $partition;
}
例如:如果我设置 $n = 4 和 $max = 30。那么我应该得到以下结果。
array(5, 7, 10, 8);
但是,此函数不考虑重复项和 0。我想要并且一直在努力实现的是生成一个数组,其中包含唯一 数字,这些数字加起来等于我预定的变量$max。 没有重复的数字和没有0和/或负整数。
最佳答案
好的,这个问题实际上是围绕线性序列展开的。考虑序列的最小值 1:
f(n) = 1 + 2 + ... + n - 1 + n
这样一个序列的总和等于:
f(n) = n * (n + 1) / 2
例如,对于 n = 4,总和为 10。这意味着如果您选择 4 个不同的数字,则没有零和负数的最小总和为 10。现在反过来:如果您有一个总和10 和 4 个数字,则只有 (1,2,3,4) 的一个组合。
因此,首先您需要检查您的总数是否至少与此下限一样高。如果它更少,则没有组合。如果相等,则恰好有一种组合。如果它更高,它会变得更复杂。
现在假设您的约束条件总共有 12 个和 4 个数字。我们已经确定 f(4) = 10。但是如果第一个(最小)数字是 2 呢?
2 + 3 + 4 + 5 = 14
所以第一个数字不能大于 1。你知道你的第一个数字。现在您生成了一个由 3 个数字组成的序列,总数为 11(即 12 - 1)。
1 + 2 + 3 = 6
2 + 3 + 4 = 9
3 + 4 + 5 = 12
第二个数字必须是 2,因为它不能是 1。不能是3,因为以3开头的三个数的最小和是12,我们要加11。
现在我们找到两个加起来为 9 (12 - 1 - 2) 的数字,其中 3 是最小的。
3 + 4 = 7
4 + 5 = 9
第三个数字可以是 3 或 4。找到第三个数字后,最后一个数字就固定下来了。两种可能的组合是:
1, 2, 3, 6
1, 2, 4, 5
您可以将其转化为通用算法。考虑这个递归实现:
$all = all_sequences(14, 4);
echo "\nAll sequences:\n\n";
foreach ($all as $arr) {
echo implode(', ', $arr) . "\n";
}
function all_sequences($total, $num, $start = 1) {
if ($num == 1) {
return array($total);
}
$max = lowest_maximum($start, $num);
$limit = (int)(($total - $max) / $num) + $start;
$ret = array();
if ($num == 2) {
for ($i = $start; $i <= $limit; $i++) {
$ret[] = array($i, $total - $i);
}
} else {
for ($i = $start; $i <= $limit; $i++) {
$sub = all_sequences($total - $i, $num - 1, $i + 1);
foreach ($sub as $arr) {
array_unshift($arr, $i);
$ret[] = $arr;
}
}
}
return $ret;
}
function lowest_maximum($start, $num) {
return sum_linear($num) + ($start - 1) * $num;
}
function sum_linear($num) {
return ($num + 1) * $num / 2;
}
输出:
All sequences:
1, 2, 3, 8
1, 2, 4, 7
1, 2, 5, 6
1, 3, 4, 6
2, 3, 4, 5
一种实现方式是获取所有序列并随机选择一个。这样做的好处是可以对所有可能的组合进行平均加权,这些组合可能对您正在做的事情有用或没有必要。
对于大总数或大量元素,这将变得笨拙,在这种情况下,可以修改上述算法以返回从 $start
到 $limit< 范围内的随机元素
而不是每个值。
关于php - 用随机生成的新值替换数组中的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794582/
我想知道有没有可能做 new PrintWriter(new BufferedWriter(new PrintWriter(s.getOutputStream, true))) 在 Java 中,s
我正在尝试使用 ConcurrentHashMap 初始化 ConcurrentHashMap private final ConcurrentHashMap > myMulitiConcurrent
我只是想知道两个不同的新对象初始化器之间是否有任何区别,还是仅仅是语法糖。 因此: Dim _StreamReader as New Streamreader(mystream) 与以下内容不同: D
在 C++ 中,以下两种动态对象创建之间的确切区别是什么: A* pA = new A; A* pA = new A(); 我做了一些测试,但似乎在这两种情况下,都调用了默认构造函数,并且只调用了它。
我已经阅读了其他帖子,但它们没有解决我的问题。环境为VB 2008(2.0 Framework)下面的代码在 xslt.Load 行导致 XSLT 编译错误下面是错误的输出。我将 XSLT 作为字符串
我想知道为什么alert(new Boolean(false))打印 false 而不是打印对象,因为 new Boolean 应该返回对象。如果我使用 console.log(new Boolean
原文首发在我的博客:https://blog.liuzijian.com/post/86955c3b-9635-47a0-890c-f1219a27c269.html 1.Lambda表达式
本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下: 写装饰器 装饰器只不过是一种函数,接收被装饰的可调用对象作为它的唯一参数,然后返回一个可调用对象(就像前面的简单例子) 注
我可以编写 YAML header 来使用 knit 为 R Markdown 文件生成多种输出格式吗?我无法重现 the original question with this title 的答案中
我可以编写一个YAML标头以使用knitr为R Markdown文件生成多种输出格式吗?我无法重现the original question with this title答案中描述的功能。 这个降价
我正在使用vars package可视化脉冲响应。示例: library(vars) Canada % names ir % `$`(irf) %>% `[[`(variables[e])) %>%
我有一个容器类,它有一个通用参数,该参数被限制到某个基类。提供给泛型的类型是基类约束的子类。子类使用方法隐藏(新)来更改基类方法的行为(不,我不能将其设为虚拟,因为它不是我的代码)。我的问题是"new
Java 在提示! cannot find symbol symbol : constructor Bar() location: class Bar JPanel panel =
在我的应用程序中,一个新的 Activity 从触摸按钮(而不是点击)开始,而且我没有抬起手指并希望在新的 Activity 中跟踪触摸的 Action 。第二个 Activity 中的触摸监听器不响
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
和我的last question ,我的程序无法检测到一个短语并将其与第一行以外的任何行匹配。但是,我已经解决并回答了。但现在我需要一个新的 def函数,它删除某个(给定 refName )联系人及其
这个问题在这里已经有了答案: Horizontal list items (7 个答案) 关闭 9 年前。
我想创建一个新的 float 类型,大小为 128 位,指数为 4 字节(32 位),小数为 12 字节(96 位),我该怎么做输入 C++,我将能够在其中进行输入、输出、+、-、*、/操作。 [我正
我在放置引用计数指针的实例时遇到问题 类到我的数组类中。使用调试器,似乎永远不会调用构造函数(这会扰乱引用计数并导致行中出现段错误)! 我的 push_back 函数是: void push_back
我在我们的代码库中发现了经典的新建/删除不匹配错误,如下所示: char *foo = new char[10]; // do something delete foo; // instead of
我是一名优秀的程序员,十分优秀!