Random 具有预期平均值且无循环的随机数

Random 具有预期平均值且无循环的随机数,random,Random,给定一个在O(1)中工作的统一随机数生成器,在区间[0..1]上生成一个随机浮点数,我怎么能在区间[a..b]上生成一个随机整数,其中a和b是整数,我期望在大量迭代中生成的平均值是c,其中c是区间上的浮点数(a..b) 我已经看过了StackOverflow上类似的问题,比如,和,但它们似乎都有不同的重点,而不是我想要的 编辑:很抱歉,我要说明一个明显不清楚的问题。我想要一个函数,它接受三个参数a、b和c,并生成一个介于和n之间的随机数,这样,如果用相同的值重复调用它,预期的平均值将是c。例如,

给定一个在O(1)中工作的统一随机数生成器,在区间[0..1]上生成一个随机浮点数,我怎么能在区间[a..b]上生成一个随机整数,其中a和b是整数,我期望在大量迭代中生成的平均值是c,其中c是区间上的浮点数(a..b)

我已经看过了StackOverflow上类似的问题,比如,和,但它们似乎都有不同的重点,而不是我想要的


编辑:很抱歉,我要说明一个明显不清楚的问题。我想要一个函数,它接受三个参数a、b和c,并生成一个介于和n之间的随机数,这样,如果用相同的值重复调用它,预期的平均值将是c。例如,如果a和b分别为0和10,则f的值为2.5或c,则函数将倾向于生成较小的数字(即在大量调用中平均值为2.5的偏态正态分布),而如果c为5,则其产生的值的分布将更加均匀。该解决方案也必须是自包含的,并且不依赖于除统一随机数生成器之外的任何其他函数的可用性。编程语言的选择在很大程度上是无关紧要的,任何命令式c类伪代码都可以。进一步注意,t这里应该没有循环,并且应该在O(1)时间内完成,并且没有提供代码,我将假设它是一种基于C的语言

总结一下你的问题,你想从随机整数的平均值中得到一个十进制数吗?我不明白你在问题的第一部分是什么意思

我会这样做(c#):

静态浮点getDecimalAverageFromInts(int a,int b)
{
如果(a>b)
{
抛出新的System.ArgumentException(“右opperand不能大于左opperand”,“a”);
};
浮动运行_总计=0;
浮动总数=0;
浮动平均值=0;
for(int i=a;i

我在控制台中测试了它。下面是完整的代码:

using System;

namespace average
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello. Please give minimum value");            
            int l_opperand;
            int r_opperand;
            if(int.TryParse(Console.ReadLine(), out l_opperand))
            {
                Console.WriteLine("Thank you for {0}, please provide a max value.", l_opperand);
                if (int.TryParse(Console.ReadLine(), out r_opperand))
                {
                    Console.WriteLine("Thank you for min value: {0} and max value: {1}", l_opperand, r_opperand);
                    Console.WriteLine("Calculating Average....");
                    float average = getDecimalAverageFromInts(l_opperand, r_opperand);
                    Console.WriteLine("Average is {0}", average);
                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("Incorrect response");
                    Console.ReadLine();
                }
            }
            else
            {
                Console.WriteLine("Incorrect response");
                Console.ReadLine();
            }
        }
        public static float getDecimalAverageFromInts(int a, int b)
        {
            if (a > b)
            {
                throw new System.ArgumentException("Right opperand cannot be greater than left opperand", "a");
            };
            float running_total = 0;
            float total = 0;
            float average = 0;
            for (int i = a; i < b; i++)
            {
                total += a;
                running_total++;
            }
            return average = (total / running_total);
        }
    }
}
使用系统;
命名空间平均值
{
公共课程
{
公共静态void Main(字符串[]args)
{
Console.WriteLine(“你好,请给出最小值”);
国际反垄断组织;
国际反垄断组织;
if(int.TryParse(Console.ReadLine(),out l_opperand))
{
WriteLine(“感谢您提供了{0},请提供一个最大值。”,l_opperand);
if(int.TryParse(Console.ReadLine(),out r_opperand))
{
WriteLine(“感谢您提供了最小值:{0}和最大值:{1}”,l_opperand,r_opperand);
Console.WriteLine(“计算平均值…”);
浮点平均值=从整数(l\u opperand,r\u opperand)中获取十进制平均值;
WriteLine(“平均值为{0}”,平均值);
Console.ReadLine();
}
其他的
{
Console.WriteLine(“错误响应”);
Console.ReadLine();
}
}
其他的
{
Console.WriteLine(“错误响应”);
Console.ReadLine();
}
}
公共静态浮点getDecimalAverageFromInts(int a,int b)
{
如果(a>b)
{
抛出新的System.ArgumentException(“右opperand不能大于左opperand”,“a”);
};
浮动运行_总计=0;
浮动总数=0;
浮动平均值=0;
for(int i=a;i
对于任何参数的选择
a
,在
{a,a+1,a+2,…,b}
上有无限多个概率分布,它们将
c
作为期望值。因此,你的问题根本不确定。还有——你为什么认为
O(1)
解决方案是可能的?理想的分布应该是最接近正态分布的分布,但它是偏斜的(定义适用于统计)向左或向右,使平均值位于与中心不同的位置。是否有一些原因使我认为这不一定是可能的?我发现了一个便宜的
O(1)
解决方案,但它与理想分布相去甚远。让
p
为选择小于
c
的数字的概率,选择小于
c
的点的概率为均匀概率(如果选择这样一个点),选择大于或等于
c
的点的概率为均匀概率(如果选择这样一个点)通过适当地选择
p
可以精确地得到
c
的期望值。这是根据中间值定理得出的。此外,还可以用代数方法求解
p
。顺便说一句,
O(1)
在离散、非均匀的情况下是很难的。
O(log(n))
其中
n=b-a+1
相当容易实现(尽管要以
O(n)
内存和预处理时间为代价)。“选择一个小于c的数字的概率应等于选择一个大于c的数字的概率。”如果你希望中位数是
c
,而不是期望值,这是正确的。对于某些离散分布,没有任何已知的
O(1)
方法来模拟它们。我认为这是二项分布的情况。从根本上说,离散分布比期望值更难模拟
using System;

namespace average
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello. Please give minimum value");            
            int l_opperand;
            int r_opperand;
            if(int.TryParse(Console.ReadLine(), out l_opperand))
            {
                Console.WriteLine("Thank you for {0}, please provide a max value.", l_opperand);
                if (int.TryParse(Console.ReadLine(), out r_opperand))
                {
                    Console.WriteLine("Thank you for min value: {0} and max value: {1}", l_opperand, r_opperand);
                    Console.WriteLine("Calculating Average....");
                    float average = getDecimalAverageFromInts(l_opperand, r_opperand);
                    Console.WriteLine("Average is {0}", average);
                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("Incorrect response");
                    Console.ReadLine();
                }
            }
            else
            {
                Console.WriteLine("Incorrect response");
                Console.ReadLine();
            }
        }
        public static float getDecimalAverageFromInts(int a, int b)
        {
            if (a > b)
            {
                throw new System.ArgumentException("Right opperand cannot be greater than left opperand", "a");
            };
            float running_total = 0;
            float total = 0;
            float average = 0;
            for (int i = a; i < b; i++)
            {
                total += a;
                running_total++;
            }
            return average = (total / running_total);
        }
    }
}