【问题标题】:Generate "characters" based on a probability根据概率生成“字符”
【发布时间】:2012-01-10 16:02:32
【问题描述】:

我的俄罗斯方块游戏需要一点帮助 我正在用 C++ 编码,这是我的问题:

俄罗斯方块列表有 7 种类型: {'I'、'J'、'L'、'S'、'Z'、'O'、'T'}

我需要选择上述字符中的一个,这样 S 和 Z 分别以 1/12 的概率选择,其他块以 每个概率 1/6。

根据这些概率生成块的最佳方法是什么?

【问题讨论】:

标签: c++ random probability


【解决方案1】:

声明并定义一个包含 S 和 Z 的单次出现的十二项数组;其余各出现两次;并从中选择一个随机元素。

【讨论】:

  • 谢谢你,我就是这么想的 :)
【解决方案2】:

像这样创建一个数组:

const char* block_distribution = {'I', 'I', 'J', 'J', 'L', 'L', 'S', 
                                  'Z', 'O', 'O', 'T', 'T'};

然后使用均匀分布从该数组中选择一个元素。

【讨论】:

  • 谢谢,我已经做了数组,现在我只需要从 [0,11] 生成一个随机数,你知道我该怎么做吗?我不熟悉 C++ 中的随机数生成
  • @Shehryar 这应该是留给读者的练习。这很容易在几乎所有参考手册中查找。
  • @ShehryarFarooq:确保你的答案不是rand() % 12,它不能满足你的要求!
【解决方案3】:

将这些字符放入字符数组中,并使用srand() 生成从 0 到 6 的随机值 比你能得到一个随机的

char myArray[] = {'I', 'J', 'L', 'S', 'Z', 'O', 'T'};

然后用

获取值

myArray[ (rand()%5)+1 ]

【讨论】:

  • 嗨 johnny,如果我希望它们以等概率正确生成,我会使用此方法?
  • 是的,初始 srand() 与主函数中的时间,以防止总是相同的“随机”值
【解决方案4】:

我能想到的最简单的解决方案是使用数值范围和伪随机数。

所以,首先为每个字母分配范围:

我:0 到 1
J:1到2
L: 2 到 3
S:3 到 3.5
Z:3.5 至 4
O:4 到 5
T:5到6

然后生成 0 到 6 范围内的伪随机数。无论数字落在该范围的哪个部分,这就是您选择的字母。

很遗憾我不懂C++,所以我不能给你提供代码,但我认为实现起来应该不会太难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2017-06-27
    • 2017-12-20
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多