Algorithm 画n个和等于100的随机整数

Algorithm 画n个和等于100的随机整数,algorithm,delphi,random,delphi-7,Algorithm,Delphi,Random,Delphi 7,伪代码示例: Random function: (1 to 5, values less than 100, sum must be equal to 100 when all random numbers are added). 结果示例: Number 1 = 35 Number 2 = 15 Number 3 = 10 Number 4 = 20 Number 5 = 20 22 4 7 18 49 Sum = 100 你的问题不是很明确。有许多可能的解决方案,具有不同的性质 我想到

伪代码示例:

Random function: (1 to 5, values less than 100, sum must be equal to 100 when all random numbers are added).
结果示例:

Number 1 = 35
Number 2 = 15
Number 3 = 10
Number 4 = 20
Number 5 = 20
22
4
7
18
49
Sum = 100

你的问题不是很明确。有许多可能的解决方案,具有不同的性质

我想到的第一个问题是:通过选择n,将区间[0,1]细分为n个部分− 在[0,1]中随机取1分。然后将其缩放到[0,A],并使用这些子区间的长度作为n个随机数和A之和

对于n=5和A=100


这使用了像泛型这样的现代Delphi技术,但是总体思路应该足够清晰,因此您可以在Delphi7中实现它,并使用您喜欢的任何排序方法。另外,我将把它作为一个练习,只使用整数和Fisher-Yates shuffle创建整数版本的
GetRandomNumbers

program cont3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;
const
  SummandsCount = 5;
  WantedSum = 100;
var
  i, j, t, Cnt, WhereToInsert: integer;
  JustNaturalNumbers: array[1..WantedSum] of Integer;
  DividingPoints: array[0..SummandsCount] of Integer;
begin
  Randomize;
  Cnt := 1;
  DividingPoints[0] := 0;
  DividingPoints[SummandsCount] := 100;
  for i := 1 to WantedSum - 1 do
    JustNaturalNumbers[i] := i;
  for i := WantedSum - 1 downto WantedSum - SummandsCount + 1 do begin
    j := 1 + Random(i);
    WhereToInsert := Cnt;
    while (WhereToInsert > 1) and (JustNaturalNumbers[j] < DividingPoints[WhereToInsert-1]) do begin
      Dec(WhereToInsert);
      DividingPoints[WhereToInsert + 1] := DividingPoints[WhereToInsert]
    end;
    DividingPoints[WhereToInsert] := JustNaturalNumbers[j];
    JustNaturalNumbers[j] := JustNaturalNumbers[i];
    Inc(Cnt);
  end;
  t := 0;
  for i := 1 to SummandsCount do begin
    Writeln(DividingPoints[i] - DividingPoints[i-1]);
    t := t + (DividingPoints[i] - DividingPoints[i-1]);
  end;
    Writeln('Sum = ', t);
  Readln;
end.

到目前为止,你取得了什么成就?你在哪里失败?StackOverflow是用来提问的,而不是委派家庭作业。数字有不同吗?允许零吗?允许负数吗?是的,这个Q没有很好的定义。正如@uwerabe所建议的,在这种情况下,你可以让它返回(20,20,20,20);这很容易实现!有些数字可能是负数吗?如果是这样,对前n-1个数字使用100*随机数,并让最后一个数字为DesiredSum-(前一个数字的总和)。这些随机数应该有什么分布?@AmigoJack,全部。嗨,很抱歉我的问题不清楚。事实上,我不是一名程序员,如果我对这一主题的知识非常有限,我不打算进一步学习/实践它。我应该提到0是不允许的,我需要整数。而且没有负数,而且这些数字必须不同,正如我的预测结果所表明的那样。谢谢你的回答!!很抱歉给您带来不便。我以后会更好地传达我的要求。或者,换句话说:如果给出了总和,那么所有总和是否都是随机的?链接@AmigoJack没有问题
program cont3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;
const
  SummandsCount = 5;
  WantedSum = 100;
var
  i, j, t, Cnt, WhereToInsert: integer;
  JustNaturalNumbers: array[1..WantedSum] of Integer;
  DividingPoints: array[0..SummandsCount] of Integer;
begin
  Randomize;
  Cnt := 1;
  DividingPoints[0] := 0;
  DividingPoints[SummandsCount] := 100;
  for i := 1 to WantedSum - 1 do
    JustNaturalNumbers[i] := i;
  for i := WantedSum - 1 downto WantedSum - SummandsCount + 1 do begin
    j := 1 + Random(i);
    WhereToInsert := Cnt;
    while (WhereToInsert > 1) and (JustNaturalNumbers[j] < DividingPoints[WhereToInsert-1]) do begin
      Dec(WhereToInsert);
      DividingPoints[WhereToInsert + 1] := DividingPoints[WhereToInsert]
    end;
    DividingPoints[WhereToInsert] := JustNaturalNumbers[j];
    JustNaturalNumbers[j] := JustNaturalNumbers[i];
    Inc(Cnt);
  end;
  t := 0;
  for i := 1 to SummandsCount do begin
    Writeln(DividingPoints[i] - DividingPoints[i-1]);
    t := t + (DividingPoints[i] - DividingPoints[i-1]);
  end;
    Writeln('Sum = ', t);
  Readln;
end.
22
4
7
18
49
Sum = 100