【问题标题】:A line which randomizing a number between two values在两个值之间随机化一个数字的行
【发布时间】:2023-03-19 00:10:01
【问题描述】:

我这次的问题不是用线而是理解它, 我从老师那里收到了这条线,用于在 MIN 和 MAX 值之间随机化一个数字,它工作得很好,但我试图理解究竟是如何,但我就是做不到。 如果有人能一步一步地向我解释,我会很高兴(请不要我不是 100% 确定 rand() 函数是如何工作的)

谢谢!

int number = (rand() % (DICE_MAX - DICE_MIN +1)) + DICE_MIN; // Randomizing a value between 'DICE_MAX' and 'DICE_MIN' which can be defined on the head of this program.

【问题讨论】:

  • 只是尝试在一张纸上,16 为最小值/最大值...试试 rand() 的一些值...
  • 我建议你把队列分成更小更简单的部分,只做一个操作。然后单步执行代码(或在纸上使用一些特定值执行)以查看发生了什么。

标签: c


【解决方案1】:

函数rand() 生成一个随机数(准确地说是伪随机数)。从它返回的int 范围很大,因此您需要将其缩放到必要的范围。

假设DICE_MIN1DICE_MAX6,则需要生成[1, 6] 范围内的随机整数。范围内有 6 个数字,DICE_MAX - DICE_MIN + 1 = 6。所以无论你从rand() 得到什么整数,rand() % (DICE_MAX - DICE_MIN + 1) 的值都将在 [0, 5] 范围内。添加所需范围的最小值DICE_MIN 会将范围移动到 [1, 6]。

这是一种在给定范围内生成随机数的非常广泛实践的技术。

【讨论】:

  • 从技术上讲,rand 在许多实现中的范围并不大(在 VC++ 中为 [0, 32767]),并且当目标范围不是非常窄时,这种方法会产生严重偏斜的分布。
【解决方案2】:

兰德:

函数:随机数生成器。
包含stdlib.h
语法int rand(void);
返回值:函数rand返回生成的伪随机数。
说明rand函数生成一个介于0RAND_MAX之间的整数( stdlib.h 中定义的符号常量。标准 C 规定 RAND_MAX 的值必须至少为 32767。如果rand 真的随机生成整数,那么0RAND_MAX 之间的每个数字在每次调用rand 时都有相同的概率被选中。

它是如何工作的?

以掷骰子(六面)为例。余数运算符% 在这里与rand 结合使用:

rand % 6;  

产生05 范围内的整数。这称为缩放。数字6 称为比例因子。但是,我们需要生成从16 的数字。现在,我们通过将1 添加到我们的结果 (1 + rand%6) 来移动生成的数字范围。

一般

n = a + rand() % b;   

其中a移位值(等于所需连续整数范围内的第一个数字,即下限),b 等于所需的连续整数范围。
在您提供的 sn-p 中

int number = (rand() % (DICE_MAX - DICE_MIN +1)) + DICE_MIN;  

DICE_MAX - DICE_MIN +1 是所需的宽度,DICE_MIN 是移位值。
延伸阅读:Using rand().

【讨论】:

  • @downvoter;发表评论应不胜感激。
  • 1.该描述提供了标准不保证的实现细节(所需的最小范围是 0-32767,而 IIRC 对周期没有要求)。 2. 不要称这个数字为“缩放因子”,你没有缩放任何东西,你正在做一个模运算。实际缩放会保持均匀分布,模会产生偏斜的分布。
  • 我同意你的第一个理由,但不同意第二个理由。
  • 请注意,“实际缩放”是不可能的。将 32768 个值统一映射到 6 是不可能的。任何公平的算法都需要丢弃一些值和/或至少在某些时候绘制多个值。
  • @hacks:如果您不进行缩放(因为您没有应用将输入范围映射到输出范围的 linear 转换),那么为什么将其称为缩放因素?
猜你喜欢
  • 2015-11-07
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2012-04-25
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多