0

您介意帮我解决以下问题吗?谢谢。

问题: 6面一次掷3个骰子的百分比可以用数学或模拟方法求出。蒙特卡罗方法是一种通过计算机模拟找出问题解决方案的计算机过程。编写一个程序,掷三个骰子,计算它们的总和,并找出掷出每个可能结果的概率。

给你一个框架程序 q1dskeleton.c,它生成 10000 次掷六面骰子的统计数据。修改程序,使其生成滚动三个六面骰子总和的统计信息。下面给出了程序输出的一个例子。请注意,由于掷骰子的随机性。

提示:每次掷骰子调用 rand() 三次,每个骰子调用一次。

骨骼:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 7

int main() {

  int face, roll, frequency[SIZE] = { 0 };

  srand( time(NULL) );

  for (roll = 1; roll <= 10000; roll++) {
    face = rand() % 6 + 1;
    ++frequency[face];
  }
  printf("%s%12s\n", "Face", "Frequency");

  for (face = 1; face <= SIZE - 1; face++)
    printf("%4d%12d\n", face, frequency[face]);
  getchar();
}

输出:

Face Frequency
3     49
4     129
5     276
6     481
7     669
8     994
9     1131
10    1213
11    1269
12    1197
13    962
14    707
15    464
16    268
17    144
18    47
4

2 回答 2

3

显然,您必须增加,SIZE因为不再有 6 种可能性,而是 18 种可能性 - 我将在这里包括 1 和 2 的不可能总数,因为您的原始解决方案包括零的不可能值 :-)

然后,不是掷一个骰子,而是掷三个,然后将这些值相加。所以像(伪代码):

dice1 = first random number
dice2 = second random number
dice3 = third random number
face = dice1 plus dice2 plus dice3

然后您可以使用该添加来增加特定的数组元素。

对于奖励积分,您可能应该避免打印出不可能的结果。for这是对最后陈述的开头部分的相当简单的修改。


顺便说一句,您期望的比率是{1, 3, 6, 10, 15, 21, 25, 27, 27, 25, 21, 15, 10, 6, 3, 1}“理想”输出应该合理地接近:

Face   Frequency
   3          46
   4         138
   5         277
   6         462
   7         694
   8         972
   9        1157
  10        1250
  11        1250
  12        1157
  13         972
  14         694
  15         462
  16         277
  17         138
  18          46

(尽管这只加起来最多 9992 个样本 - 至于其他 8 个样本出现在哪里,这是一个废话)。

于 2011-03-08T07:59:19.047 回答
2

此外,在计算 rand() 时,您需要意识到它并不像我们希望的那样随机。

来自以下文档:http ://www.cplusplus.com/reference/clibrary/cstdlib/rand/ “请注意,尽管此模运算不会在跨度中生成真正均匀分布的随机数(因为在大多数情况下,较低的数字是稍微更有可能),但它通常是短跨度的一个很好的近似值。”

因此,为了获得更好的结果,最好为具有更高随机结果概率的兰特范围获得不同的公式。

例如,对于一个骰子,您会得到一个介于 30 和 90 之间的随机数,公式是 (int)((((float)result - 30) / 10) + 0.5 或类似的东西。

然后对于骰子 2,您可以获得 500 到 50000 之间的数字并制作另一个公式。

为了让你的家庭作业更有趣,你可以看看不同的在线赌场/扑克室是如何做到这一点的。 http://www.fulltiltpoker.com/random-number-generator

于 2011-03-08T08:21:28.913 回答