【问题标题】:How to generate random partitions of float number and each part has minimum value pMin?如何生成浮点数的随机分区并且每个部分都有最小值pMin?
【发布时间】:2015-08-20 00:31:39
【问题描述】:

例如:

我想把33.38分成5份,每份都等于或大于1.2:

2.71,3.3,18.7,1.56,7.11

伪代码中的函数:

public static void printRandomPartition(float value,int numberOfParts,float pMin){
}

public static void main(String[] args){
    //it will print 2.71,3.3,18.7,1.56,7.11
    printRandomPartition(33.38,5,1.2);
}

另一种情况:

将18.77分成3份,每份都等于或大于3.2:

4.8,9.55,4.42

当然输入输出也可以是3.82000000000003这样丑陋的float格式,只是举例而已。

我搜索了一些关于它的帖子,但似乎大多数都是关于整数的,并且整数中使用的方法通常使用数组 int myArray[n] (n是要被除的整数),这对于处理浮点数没有用。谁能帮忙?

【问题讨论】:

  • 您知道例如 3.82 不能用浮点数精确表示吗?
  • 我假设您想要每个部分的均匀分布?请注意,您可以从 33.38 中删除 5*1.2 并忽略“等于或大于 1.2”约束,并在提取每个部分后简单地将其添加回来。

标签: algorithm math language-agnostic


【解决方案1】:

伪代码

function Divide(Sum, NParts, MinValue)
  //subtract minimal values to deal with corrected sum
  ASum = Sum - MinValue * NParts

  //generate uniform randoms (in any reasonable range), take their sum    
  BSum = 0
  for i = 0.. NParts - 1
     Part[i] = Random
     BSum = BSum + Part[i]

  //scale randoms to get right corrected sum, then add minimal value to get initial sum
  for i = 0.. NParts - 1
     Part[i] = Part[i] * ASum / BSum + MinValue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2010-10-15
    相关资源
    最近更新 更多