C#分配号码的公式

时间:2009-07-30 02:20:58

标签: c# math

我正在寻找一种能够根据最小数量,最大数量和数量(或点数)之间的线性格式展开数字的公式。问题是,越接近最大值,那里的数字就越多。

一个例子(数字会有所不同,大约会增加100倍)

Min = 0
Max = 16
AmountOfNumbersToSpread = 6

0 1 2 3 4 5 6 7 8 9 A B C D E F

1           2       3   4   5 6 

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

根据Tal Pressman的回答,您可以编写如下分配函数:

IEnumerable<double> Spread(int min, int max, int count, Func<double, double> distribution)
    {
    double start = min;
    double scale = max - min;
    foreach (double offset in Redistribute(count, distribution))
        yield return start + offset * scale;
    }

IEnumerable<double> Redistribute(int count, Func<double, double> distribution)
    {
    double step = 1.0 / (count - 1);
    for (int i = 0; i < count; i++)
        yield return distribution(i * step);
    }

您可以使用以这种方式映射[0; 1]到[0; 1]的任何类型的分布函数。例子:

二次

Spread(0, 16, 6, x => 1-(1-x)*(1-x))

Output: 0 5.76 10.24 13.44 15.36 16

正弦

Spread(0, 16, 6, x => Math.Sin(x * Math.PI / 2))

Output: 0 4.94427190999916 9.40456403667957 12.9442719099992 15.2169042607225 16

答案 1 :(得分:1)

基本上,你应该有类似的东西:

  1. 生成介于0和1之间的随机数。
  2. 实施所需的分配函数([0,1] - > [0,1]中的1:1函数)。
  3. 缩放分布函数的结果以匹配您想要的范围。
  4. 用于第二个点的确切函数是根据您希望如何分配数字来确定的,但是根据您的要求,您将需要一个函数的值大于0的值。例如,一个罪或cos函数。

答案 2 :(得分:0)

在纸上试过这个并且有效:

给定MIN,MAX,AMOUNT:

Length = MAX - MIN
"mark" MIN and MAX
Length--, AMOUNT--
Current = MIN
While AMOUNT > 1
  Space = Ceil(Length * Amount / (MAX - MIN))
  Current += Space
  "mark" Current

通过“标记”我的意思是选择那个数字,或者你需要做什么。

答案 3 :(得分:0)

关闭答案,但并不完全,需要为更大的数字工作。

List<int> lstMin = new List<int>();

int Min = 1;
int Max = 1500;

int Length = Max - Min;
int Current = Min;
int ConnectedClient = 7;
double Space;

while(ConnectedClient > 0)
{
    Space = Math.Ceiling((double)(Length * ConnectedClient / (Max - Min)));
    Current += (int)Space;

    ConnectedClient--;
    Length--;

    lstMin.Add(Current);
}