Random 生成总和为常数的随机数
我在想,是否有办法生成一组随机数,其和总是常数。例如,20可以分为5个数字(1,2,3,4,10)。我不在乎5个数字中的每一个是什么,只要它们的和等于20。是否还有其他方法可以通过编程实现?使用库函数获取随机数 现在,您想要的随机数是生成的随机数mod允许的和 接下来,将允许的总和减去刚才生成的数字 假设库随机数生成器返回的第一个随机数是109 所以你的第一个随机数是109模20=9。将允许的总数更新为20-9=11 你继续前进,直到你允许的总数为零Random 生成总和为常数的随机数,random,numbers,sum,Random,Numbers,Sum,我在想,是否有办法生成一组随机数,其和总是常数。例如,20可以分为5个数字(1,2,3,4,10)。我不在乎5个数字中的每一个是什么,只要它们的和等于20。是否还有其他方法可以通过编程实现?使用库函数获取随机数 现在,您想要的随机数是生成的随机数mod允许的和 接下来,将允许的总和减去刚才生成的数字 假设库随机数生成器返回的第一个随机数是109 所以你的第一个随机数是109模20=9。将允许的总数更新为20-9=11 你继续前进,直到你允许的总数为零 请注意,我假设您提到的数字5只是一个示例。如
请注意,我假设您提到的数字5只是一个示例。如果希望随机数正好为5,则可能必须修改此方法。是!试试这个算法
num1=rand()%20;
num2=rand()%(20-num1);
num3=rand()%(20-num1-num2);
num4=rand()%(20-num1-num2-num3);
num5=20-num4-num3-num2-num1;
因此,可以肯定这五个数字是随机的,它们的总和是20[如果需要,可以使用循环执行此操作 通常,您可以首先随机生成数字[n]的数量,这些数字的总和为手头的数字[K]
n=rand()%k;--assuming the number of rand numbers you want are between 1 and k[sum]
n1=rand()%k;
n2=rand()%(k-n1)
.
.
nn-1=rand()%(k-n1...-nn-2)
nn=k-n1-n2...nn-1
我希望这对你有帮助 要获得均匀分布,诀窍是将求和视为一条数字线,而不是为线段生成随机数,而是沿该线生成n-1个数字作为点,然后减去得到线段。以下是来自的函数:
静态整数比较(常量无效*a,常量无效*b){
返回*(int*)a-*(int*)b;
}
void ojr_数组_和(ojr_生成器*g,int*a,int计数,int和){
int i;
对于(i=0;i0;--i){a[i]=a[i-1];}
}
ojr\u rand(g,limit)
生成一个从0到limit-1的统一随机整数。然后,此函数使用添加到sum
的count
随机整数填充数组a
。将其应用于任何其他RNG应该不会太难。这有点小技巧,但仍然:)我认为这是一个可能的想法,并不是说这是最好的
(最重要的是,您需要整数,所以它无论如何都不起作用) 如果所需的随机数不是必需的整数:
然后可以在[0,1]之间生成N个随机数,然后将数组规格化为S:)
for(i=0;i如果生成的数字不一定是正数或在某个范围内。
您可以计算最后一个数字可以是S-和(A1..A[N-1])
N-1随机数的选择显然是一致的,
因为最后一个数字取决于其余的数字
(每组最后一个数字只有一个选项)
统一性不受阻碍
Arr = new int[N];
int sum=0;
for(i=0; i<N-1; i++)
{
int x = getRandomInt();
sum += x;
Arr[i] = x;
}
Arr[N-1] = S - sum;
return Arr;
Arr=newint[N];
整数和=0;
对于(i=0;i在我的例子中,我必须对值数组执行此操作,它取和并将其随机拆分为一系列数字
<html>
<script type="text/javascript">
function f(){
var array = [{
order: '1-2480831',
value: 2040
}, {
order: 'BAESYS-2012-0001',
value: 570
}, {
order: 'BAESYS-2012-0002',
value: 773
}, {
order: '1-3840231',
value: 299
}, {
order: '1-3840298',
value: 1609
}, {
order: '1-3841519',
value: 1940
}];
var splitInto = 3;
document.write("[");
for (i=0; i<array.length; i++)
{
document.write("{ Id : '"+array[i].order+"', Data : [");
var result = RandGenerator(splitInto,array[i].value);
var sum = 0;
for(ii =0;ii<result.length; ii++){
sum += result[ii];
document.write(result[ii]+',');
}
document.write("]},");
}
document.write("]");
}
function RandGenerator(count, sum) {
var a = [];
for (iii = 0; iii < count-1; iii++)
{
a[iii] = getRandToValue(sum);
sum -= a[iii];
}
a[count-1] = sum;
return a;
}
function getRandToValue(maxRand)
{
var random = Math.random();
var computed = (maxRand)*random;
return computed;
}
f();
</script>
</html>
函数f(){
变量数组=[{
订单:“1-2480831”,
价值:2040
}, {
命令:“BAESYS-2012-0001”,
价值:570
}, {
订单:“BAESYS-2012-0002”,
价值:773
}, {
订单:“1-3840231”,
价值:299
}, {
订单:“1-3840298”,
价值:1609
}, {
订单:“1-3841519”,
价值:1940
}];
var splitInto=3;
文件。填写(“[”);
对于(i=0;i此方法执行此任务,还允许控制值之间的“差异程度”(例如,如果希望数组值彼此接近)
/**
*创建正整数数组,该数组精确求和到给定的(整数)数。
*@param{Number}项目数
*@param{Number}sum必需和
*@param{Number}[d=100]值之间的差值(0..100)
*/
randomSumArray:函数(len、sum、d){
var _sum=0;
var-arr=[];
var n,i;
如果(!d&&d!==0){
d=100;
}
对于(i=0;i=0){
arr[i]+=x;
diff-=x;
}
j++;
}
}
返回arr;
}
所谓“总和”,是指“产品”吗?即使你澄清了这一点,问题仍然很不清楚。数字是只有正数还是两个负数都可以存在?不会是统一的。这将产生太多的分布,一个大数字和四个小数字。你是对的,它不会是统一的。我不认为在这种特殊情况下需要它,尤其是go他举了一个例子。在一般情况下,我们当然需要均匀分布。然后,剩下的4个数字中有一个可能是1,否则它们都是零。如果你想要公平分布,你需要修改算法。比如使用rand()mod 6而不是rand()mod 20I试图给出一个更好的解决方案。更好的解决方案是使用算法,如n1=(2+rand()mod 4)对所有数字使用此方法,除了最后一个
Arr = new int[N];
int sum=0;
for(i=0; i<N-1; i++)
{
int x = getRandomInt();
sum += x;
Arr[i] = x;
}
Arr[N-1] = S - sum;
return Arr;
<html>
<script type="text/javascript">
function f(){
var array = [{
order: '1-2480831',
value: 2040
}, {
order: 'BAESYS-2012-0001',
value: 570
}, {
order: 'BAESYS-2012-0002',
value: 773
}, {
order: '1-3840231',
value: 299
}, {
order: '1-3840298',
value: 1609
}, {
order: '1-3841519',
value: 1940
}];
var splitInto = 3;
document.write("[");
for (i=0; i<array.length; i++)
{
document.write("{ Id : '"+array[i].order+"', Data : [");
var result = RandGenerator(splitInto,array[i].value);
var sum = 0;
for(ii =0;ii<result.length; ii++){
sum += result[ii];
document.write(result[ii]+',');
}
document.write("]},");
}
document.write("]");
}
function RandGenerator(count, sum) {
var a = [];
for (iii = 0; iii < count-1; iii++)
{
a[iii] = getRandToValue(sum);
sum -= a[iii];
}
a[count-1] = sum;
return a;
}
function getRandToValue(maxRand)
{
var random = Math.random();
var computed = (maxRand)*random;
return computed;
}
f();
</script>
</html>
/**
* Create array of positive integers which exactly sums to a given (integer) number.
* @param {Number} number of items
* @param {Number} sum required sum
* @param {Number} [d=100] difference degree between the values (0..100)
*/
randomSumArray: function(len, sum, d) {
var _sum = 0;
var arr = [];
var n, i;
if (!d && d !== 0) {
d = 100;
}
for (i = 0; i < len; i++) {
var from = (100 - d) * 1000,
to = (100 + d) * 1000,
n = Math.floor(Math.random() * (to - from + 1) + from); //random integer between from..to
_sum += n;
arr.push(n);
}
var x = sum / _sum;
_sum = 0; //count sum (again)
for (var i = 0; i < len; i++) {
arr[i] = Math.round(arr[i] * x);
_sum += arr[i];
}
var diff = sum - _sum;
// Correct the array if its sum does not match required sum (usually by a small bit)
if (diff) {
x = diff / Math.abs(diff); //x will be 1 or -1
var j = 0;
while (diff && j < 1000) { //limit to a finite number of 'corrections'
i = Math.floor(Math.random() * (len + 1)); //random index in the array
if (arr[i] + x >= 0) {
arr[i] += x;
diff -= x;
}
j++;
}
}
return arr;
}