RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 820241
Accepted
JMNext
JMNext
Asked:2020-04-27 20:48:16 +0000 UTC2020-04-27 20:48:16 +0000 UTC 2020-04-27 20:48:16 +0000 UTC

生成随机小数

  • 772

有这样一个任务:生成一个数字数组,其总和为 1。数字的个数是从键盘输入的。解决方案可以是获得总量 1 的任何主要事物(不希望有大量的零)

c#
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. Best Answer
    Андрей NOP
    2020-04-27T21:07:10Z2020-04-27T21:07:10Z

    我们生成 N个任意非负数。
    我们计算它们的总和。
    我们除以这个数量。

    实现示例:

    int count = 10;
    Random random = new Random();
    int[] integers = new int[count];
    long sum = 0;
    for (int i = 0; i < count; ++i)
    {
        integers[i] = random.Next();
        sum += integers[i];
    }
    double[] doubles = new double[count];
    for (int i = 0; i < count; ++i)
        doubles[i] = (double)integers[i] / sum;
    Console.WriteLine(string.Join("\n", doubles));
    Console.WriteLine(doubles.Sum());
    

    random.Next()返回一个非负随机整数。
    为了累积总和,我们采用long- 变量来避免溢出。

    • 23
  2. AnT stands with Russia
    2020-04-28T01:53:45Z2020-04-28T01:53:45Z

    除以预生成数字的总和的选项不会给出结果的均匀分布,因为均匀分布的值的总和本身并不是均匀分布的。并且通常暗示了此类问题中结果的均匀分布。

    更适合分布的解决方案是N-1在范围内生成非递减的均匀分布随机数[0, 1]

    r 1 ≤ r 2 ≤ r 3 ≤ ... ≤ r N-1

    然后将 r 0 = 0 和 r N = 1 并将邻居中的成对差异作为所需的数字

    r 1 - r 0 , r 2 - r 1 , r 3 - r 2 , ..., r N - r N-1

    在 C++ 中

    #include <cstdlib>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    int main()
    {
      unsigned N = 10;
      std::vector<unsigned> r(N + 1);
    
      r.front() = 0;
      std::generate(r.begin() + 1, r.end() - 1, std::rand);
      std::sort(r.begin() + 1, r.end() - 1);
      r.back() = RAND_MAX;
    
      for (unsigned i = 1; i <= N; ++i)
        std::cout << double(r[i] - r[i - 1]) / RAND_MAX << " ";
    
      std::cout << std::endl;
    }
    
    • 14
  3. yolosora
    2020-04-27T21:01:07Z2020-04-27T21:01:07Z

    rnd-Random

     static double[] Generate(int count)
     { 
        var result = new double[count];
        var max = 1.0;
        for (int i = 0; i < count - 1; i++)
        {
           result[i] = rnd.NextDouble() * max;
           max -= result[i];
        }
        result[count-1] = max;
        return result;
     }
    

    此外,如果对于这样的生成至关重要,则可以对数组进行混洗,平均而言,下一个值变得小于前一个值。简单的混合示例:

    result.OrderBy(x => rnd.Next()).ToArray();

    • 10
  4. default locale
    2020-04-27T21:10:39Z2020-04-27T21:10:39Z

    好吧,既然没有限制,那么最原始的解决方案:一个数组,其中第一个元素为 1,其余为 0。

    int n = 5;
    var arr = new decimal[n];
    arr[0] = 1;
    

    更新:补充说明许多零是不可取的。因此,该解决方案是不合适的。

    选项2:用值1/n填充数组:

    int n = 6;
    var value = 1.0m/n;
    var arr = Enumerable.Repeat(value, n).ToArray();
    

    这里有一个问题:由于除法时的舍入误差,总和可能不会收敛。为了使总和收敛,我们补偿第一个元素:

    arr[0] = 1-(value*(n-1));
    
    • 6
  5. Даниил Чижевский
    2020-04-27T20:57:29Z2020-04-27T20:57:29Z

    其中一个想法是创建大整数,然后将它们除以 1000。这将形成一个小数数组 =) 要执行的操作,直到所有元素的总和等于 1。每个形成的数字需要检查:是否符合条件(应小于差 1 和数组剩余元素之和)。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5