1

我试图在 -1 到 6 的范围内生成一个随机数,但是每次我生成一个随机数时,在该范围内获得一个数字的概率都以百分比给出。例如,在百分比列表中,第一个百分比具有生成 6 的概率,第二个百分比具有生成 5 的概率,依此类推。数字必须随机生成。我正在尝试用 C 编写代码。谢谢你的想法。

4

5 回答 5

4

你可以得到一个介于 0 到 100 之间的随机数,然后检查它落入的百分比范围并为其分配相应的值。

例如:

    0 - 5  : -1
    5 - 25 :  0
    25 - 31:  1
    31 - 48:  2
    48 - 50:  3
    50 - 75:  4
    75 - 87:  5
    87 - 100: 6

编辑:

要实现这一点,您需要一个或两个数组,一个存储百分比边界(在这种情况下表示 5、25、31、48、50、75、87)和另一个存储输出值的数组(如果输出完全随机的,在这里它们是连续的,你不需要第二个数组)。
然后你会接到电话rand() * 100.0 / RAND_MAX以获得 0 到 100 之间的随机浮点数或 0 到 100rand() % 100 + 1之间的随机整数。

有了这个,您可以使用二进制搜索方法来查找在 O(log n) 时间内对应的百分比范围。使用索引,您可以找到相应的输出(通过数组或函数)

于 2012-04-12T20:27:10.210 回答
1

这是家庭作业吗?为了对人类有信心,我假设不会;)

所以我的意思是,你所有的百分比加起来应该是 100 对吧?您可以生成一个介于 0 和 100 之间的数字,并查看它属于哪个括号。

即如果你的百分比是 [10,20,35,15,10,10]

然后第一个括号是“< 10”,因此生成的任何小于 10 的数字都会产生 6

x < 10 --> 6
10 <= x < (10+20) --> 5
(10+20) <= x < (10+20+35) --> 4
(10+20+35) <= x < (10+20+35+15) --> 3

等等。您希望生成一个介于 1 和 100 之间的随机浮点数,以满足例如 11.9 之类的精确百分比。

于 2012-04-12T20:29:23.843 回答
1

制作一个包含 100 个元素的数组,用 -1 到 6 填充它,这取决于每个元素需要多少权重。例如,如果您需要 -1 来获得 15% 的命中率,则使用 -1 填充 15 个元素。现在生成一个从 1 到 100 的随机数,然后简单地查找数组,就可以得到加权的实际结果。

于 2012-04-12T20:57:48.710 回答
0

我确信还有其他可能更好的方法来执行此操作,但我想到的是:根据您的百分比创建一个包含每个数字(-1 到 6)的适当副本的数组。然后随机选择数组中的一个元素。

于 2012-04-12T20:27:32.230 回答
0

我认为最简单的方法是考虑以下类比:

如果你有一条线[0,1],你可以认为从1到4生成一个数字相当于将线分成4段,S_1 = [0,1/4], S_2 = [1/4,2 /4],S_3 = [2/4,3/4],S_4 = [3/4,1]。这样,当你从 [0,1] 生成一个数字时,如果它落在段 S_i 上,则生成的数字是 i。

如果你想为每个数字分配不同的概率,比如 p_i,你只需要根据 p_i 将段划分为不同的大小。

例如,对于 p_1 = 0.1 的 1、p_2 = 0.4 的 2、p_3 = 0.2 的 3 和 p_4 = 0.3 的 4,您可以使用分段 S_1 = [0,p_1]、S_2 = [p_1,p_1+p_2], S_3 = [p_1+p_2,p_1+p_2+p_3] 和 S_4 = [p_1+p_2+p_3,p_1+p_2+p_3+p_4]

然后你在[0,1]上生成一个统一的随机数,并测试它是否落入S_i。

于 2012-04-12T20:29:35.730 回答