首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等总随机数

等总随机数
EN

Stack Overflow用户
提问于 2013-10-19 11:04:48
回答 2查看 740关注 0票数 6

我有4个号码

代码语言:javascript
运行
复制
a,b,c,d : integers

我需要给每个人分配一个2-7之间的随机数,但是所有四个数字的总数必须是22。

我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2013-10-19 14:55:49

警告:@DavidHeffernan.已证明此解决方案不统一。

22是一个相当低的数字,因此,以下几点应该工作得相当好:

代码语言:javascript
运行
复制
procedure ShowValues;
const
  TOTAL = 22;
  VALUE_COUNT = 4;
  MIN_VALUE = 2;
  MAX_VALUE = 7;
var
  Values: array[0..VALUE_COUNT-1] of Integer;
  Shortage: Integer;
  Candidates: TList<Integer>;
  ValueIndex: Integer;
  CandidateIndex: Integer;
begin
  Assert(VALUE_COUNT * MAX_VALUE >= TOTAL, 'Total can never be reached!');
  Assert(VALUE_COUNT * MIN_VALUE <= TOTAL, 'Total is always exceeded!');
  Candidates := TList<Integer>.Create;
  try
    for ValueIndex := 0 to VALUE_COUNT-1 do
    begin
      Values[ValueIndex] := MIN_VALUE;
      Candidates.Add(ValueIndex);
    end;
    Shortage := TOTAL - VALUE_COUNT * MIN_VALUE;
    while Shortage > 0 do
    begin
      CandidateIndex := Random(Candidates.Count);
      ValueIndex := Candidates[CandidateIndex];
      inc(Values[ValueIndex]);
      if Values[ValueIndex] = MAX_VALUE then
        Candidates.Delete(CandidateIndex);
      dec(Shortage);
    end;
  finally
    Candidates.Free;
  end;
  ShowMessage(IntToStr(Values[0]) + ' ' + IntToStr(Values[1]) + 
    ' ' + IntToStr(Values[2]) + ' ' + IntToStr(Values[3]));
end;

所有四个数字都初始化为最小值。然后,虽然我们还没有达到总数,我们随机选择一个数字,仍然可以增加,并增加一个。

票数 2
EN

Stack Overflow用户

发布于 2013-10-20 11:29:52

一种不涉及构建所有可能样本的表格的有效备选方案如下:

  1. 在范围2.7中选择三个值。
  2. 将第四个值设为22减去前三个之和。
  3. 如果第四个值不在范围2..7,则为goto 1。
  4. 返回这四个值。

编码很简单,并且使用了与我的第一个答案相同的结构:

代码语言:javascript
运行
复制
function GetSample: TValue;
begin
  repeat
    Result.a := RandomRange(2, 8);
    Result.b := RandomRange(2, 8);
    Result.c := RandomRange(2, 8);
    Result.d := 22 - Result.a - Result.b- Result.c;
  until InRange(Result.d, 2, 7);
end;

使用与我的第一个答案相同的测试工具,经验概率质量如下所示:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19465347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档