微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

随机整数范围 0 到 100,结果总和也不能超过 100

如何解决随机整数范围 0 到 100,结果总和也不能超过 100

所以生成器询问“什么是 40+20”,用户输入 60,所以它是有效的,如果生成器打印出 80+80,答案将是平均 160,但它不会超过 100,我将如何限制随机数,所以总和不会超过 100?

解决方法

如果您需要实际均匀分布(如公平掷骰子),您可以先掷总和,然后掷总和成分之一:

std::random_device rd; 
std::mt19937 gen(rd()); 
std::uniform_int_distribution<> dist1(0,100);

int sum = dist1(gen);

std::uniform_int_distribution<> dist2(0,100 - sum);

int a = dist2(gen);
int b = sum - a;

一种天真的方法是使用 RNG 生成总和的两个成分,但这会偏向于范围的高端(比 0-50 范围更有可能生成 50-100 范围内的总和)。这实际上可能是一个更好的解决方案,如果您的程序是例如测试用户进行最多 100 次求和的能力 - 您想用更大的数字而不是他们可以用手指计算的数字来测试他们。但是您也可以通过将总和的较低范围设置为高于 0 来获得该好处。

std::random_device rd; 
std::mt19937 gen(rd()); 
std::uniform_int_distribution<> dist1(0,100);

int a = dist1(gen);

std::uniform_int_distribution<> dist2(0,100 - a);

int b = dist2(gen);

This little program 展示了两种方法之间的区别。它从每个中计算 100000 个总和,并生成直方图以显示有多少总和落在每个范围内。这很糟糕,因为 100 在直方图中有自己的范围,但该点应该通过。在幼稚的方法中,滚动两个数字使其总和等于 90-100 范围内的数字比滚动两个数字总和小于 10 的可能性要大得多。


您用 标记了您的问题,这意味着您应该更喜欢使用标准库 <random> 而不是 rand()(因为 rand() is bad)。如果您愿意,这是带有 rand() 的版本:

int sum = rand() % 100;
int a = rand() % (100 - sum);
int b = sum - a;

或者天真的版本:

int a = rand() % 100;
int b = rand() % (100 - a);
,

“随机”是什么意思?

数字 5 是一个随机数。我只是通过滚动 6 面骰子来选择它。您的总和始终可以是 5+5=10。

您的意思可能是“均匀随机”。但是统一什么

如果您希望答案在 0 到 100 之间保持一致,请先选择答案,然后选择从 0 到答案的两个值之一。

缺点是作为总和的 0 与 100 一样常见,并且只有一组从 0 到 100 的数字加到 0,以及 100 对数字加到 100。

如果您希望每个可能的等式都有相同的机会,一个简单的方法是生成两个 0 到 100 之间的随机数,然后取最大值。这是你的答案。现在,选择一个从 0 到该总和的随机数;这是第一个值。第二个值是总和减去第一个值。

另一种更简单的方法是从 0 到 100 中随机选择一个数字。然后从 0 到(第一个 100 的数字)中选择第二个数字。这种分布对于每个可能的方程发生的几率是不均匀的:0+0 的发生几率为万分之一 (0.01%),而 100+0 的发生几率为 1.01%,几乎是 100 倍。

但如果你不太在意分布,那也没关系。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。