相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

0.1 + 0.2 == 0.3  ->  false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2         ->  0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

在具有常数和的范围内生成N个随机数

我想生成从[a,b]之间的特定分布(例如,均匀随机)中抽取的N个随机数,它们总和为常数C.我尝试了几种我能想到的解决方案,有些提议在类似的线程但是他们中的大多数要么是为有限形式的问题工作,要么我无法证明结果仍然遵循预期的分布.

我尝试过:生成N个随机数,将它们全部除以它们的总和并乘以所需的常数.这似乎有效,但结果并不遵循数字应在[a:b]范围内的规则.

Generage N-1随机数加0和期望的常数C并对它们进行排序.然后计算每两个连续nubmers之间的差异,结果是差异.这再次总结为C但是具有与最后一个方法相同的问题(范围可以大于[a:b].

我还尝试生成随机数,并始终以保持所需总和和范围的方式跟踪最小值和最大值,并提供此代码:

bool generate(function<int(int,int)> randomGenerator,int min,int max,int len,int sum,std::vector<int> &output){
    /**
    * Not possible to produce such a sequence
    */
if(min*len > sum)
    return false;
if(max*len < sum)
    return false;

int curSum = 0;
int left = sum - curSum;
int leftIndexes = len-1;
int curMax = left - leftIndexes*min;
int curMin = left - leftIndexes*max;

for(int i=0;i<len;i++){
    int num = randomGenerator((curMin< min)?min:curMin,(curMax>max)?max:curMax);
    output.push_back(num);
    curSum += num;
    left = sum - curSum;
    leftIndexes--;
    curMax = left - …
Run Code Online (Sandbox Code Playgroud)

c++ random algorithm sum range

9
推荐指数
2
解决办法
2298
查看次数