返回介绍

12.15 随机加权的条件 — randcase

发布于 2020-09-09 22:55:51 字数 1172 浏览 1283 评论 0 收藏 0

statement_item ::=         // 引用自附录A.6.4
    ...
  | randcase_statement

randcase_statement ::=     // 引用自附录A.6.7
    randcase randcase_item {randcase_item} endcase

randcase_item ::= expression : statement_or_null

语法12-11 — randcase语法(摘录自附录A)

randcase关键字引入了一个条件语句,它可以随机地选择它的一条分支。randcase条目表达式是非负的integral值,它们构成了分支权重。一个条目的权重除以所有权重的和指定了该分支被选中的概率。例如:

randcase
    3 : x = 1;
    1 : x = 2;
    4 : x = 3;
endcase

在这个例子中,所有权重的和为8,所以第一条分支被选中的概率为0.375,第二条分支被选中的概率为0.125,第三条语句被选中的概率为0.5。

如果一条分支被指定了为0的权重,那么这条分支不会被选中。如果所有的randcase条目的权重都被指定为0,那么没有条目会被选中,并且可以发布一个警告信息。

randcase权重可以是任意表达式,而不仅仅是常量。例如:

byte a, b;

randcase
    a + b : x = 1;
    a - b : x = 2;
    a ^ ~b : x = 3;
    12'b800 : x = 4;
endcase

每一个权重表达式的精度是依据自决的。权重的和使用标准的加法语义计算(所有权重的最大精度),其中被一个被加数都是无符号的。每一个权重表达式以一个未指定的顺序至多计算一次(具体的实现可以缓存相同的表达式)。在上面的例子中,前三个权重表达式使用8位的精度计算,第四个表达式使用12位精度计算;结果权重以12位精度以无符号值相加。权重选择接下来会使用无符号的12位比较。

每一次对rancase的调用都会在0到权重之和的范围内重新获得一个随机数。接下来权重以声明的顺序被选择:较小的随机数对应于第一条(最上面的)权重语句。

rancase语句展示了线程稳定性。随机数从$urandom_range()获得,因此随机数独立于线程执行的顺序。这能够导致对$urandom_range()的多次调用以便处理大于32位的情况。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文