【问题标题】:Generate a random number sequence to get and average生成一个随机数序列来获取和平均
【发布时间】:2012-06-24 07:56:08
【问题描述】:

我希望生成一个数字序列,其中每个数字都在 70 到 100 之间,序列中会有 x 个数字,它会给出 y 的平均值。这个算法会是什么样子?

【问题讨论】:

  • 数字的平均值是否必须恰好为 y 或仅在多次运行时得出的平均值为 y?
  • 哎呀,也许我错过了理解这个问题:-)
  • 在您告诉我们分布情况之前,您不会得到一个好的答案。这是最难的部分。

标签: algorithm random numbers


【解决方案1】:

我认为它们不可能均匀分布在 70 到 100 之间并且同时具有给定的平均值。

您可以做的是生成具有给定平均值的随机数,然后将它们缩放以适应 [70, 100](但它们不会在那里均匀分布)。

  1. 生成随机数 [0..1(

  2. 计算它们的平均值

  3. 将它们全部相乘以匹配所需的平均值

  4. 如果其中任何一个不适合 [70, 100],则通过将它们与 y 的距离减小相同的因子来再次缩放它们(这不会改变平均值)。 x[i] = y + (x[i] - y)*scale

您最终会得到所有在 [70, 100( 范围内的数字,但它们将均匀分布在以 y 为中心的不同(但重叠)区间内。此外,这种方法仅适用于实数/浮点数。如果你想要整数,你就会遇到组合问题。

【讨论】:

  • 对,它们不能均匀分布。例如,如果 y 是 72,那么 70 到 72 之间的数字必须比 72 到 100 中的数字出现得更多,才能使它们的平均值仍然为 72。
  • 这仍然可能以均匀分布发生,但极不可能发生。均匀分布意味着对如何选择数字没有没有限制。
  • 顺便说一句:我们想要整数吗?因为如果我们这样做,这将成为一个组合问题。我的解决方案仅适用于实数。
【解决方案2】:

Python 示例

import random
import time

x     = 10
total = 0
avg   = 0


random.seed(time.time())
for x in range(10):
    total += random.randint(70,100)

avg = total /x

print "total: ", total
print "avg: ", avg

【讨论】:

  • 但在这里您希望“平均”达到预先指定的固定数字。
【解决方案3】:
        Random r = new Random();
        List<int> l = new List<int>();
        Console.Write("Please enter amount of randoms ");
        int num = (int)Console.Read();
        for (int i = 0; i < num; i++)
        {
            l.Add(r.Next(0, 30) + 70);
        }

        //calculate avg
        int sum = 0;
        foreach (int i in l)
        {
            sum += i;
        }

        Console.Write("The average of " + num + " random numbers is " + (sum / num));

        //to stop the program from closing automatically
        Console.ReadKey();

【讨论】:

  • 不,部分问题是必须先指定平均值,然后再找不到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 2012-12-29
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多