2012-04-12 108 views
1

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

+0

致VTC-ers。这实际上是一个很常见的事情(与本地化相反),虽然它有点复杂的描述。 – bitmask 2012-04-12 20:28:07

回答

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之间rand() % 100 + 1随机浮动为0和100

之间的随机INT有了这个,你可以使用二进制搜索方法来查找百分比范围这相当于为O (log n)时间。随着指数你找到相应的输出(通过一个数组或功能)

+0

我其实做了这样的事情,但我教我做错了..但谢谢澄清它对我 – user1319817 2012-04-12 20:29:55

0

我敢肯定还有其他的,可能会更好,这样做的方法,但想到什么是这样的:创建一个包含适当的数组根据你的百分比,每个数字的副本(-1到6)。然后在数组中随机选取一个元素。

+0

这项工作,如果百分比是整数,百分比如0.5%,这将无法正常工作 – SirGuy 2012-04-12 20:28:33

1

这是一项家庭作业吗?我将不承担,对于具有对人类的信念的缘故)

所以我的意思是,你所有的百分比应为100对不对? 您可以生成一个介于0和100之间的数字,并查看它落入哪个支架。

即如果您的百分数都是[10,20,35,15,10,10]

然后,第一托架是 “< 10”,所以在10产生的任何数目yeilds 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的精度百分比。

+0

不,它不是一个家务任务;)我只是试图做一个简单的基于文本的游戏。感谢您的输入:) – user1319817 2012-04-12 20:34:13

0

我认为这样做最简单的方法是考虑下面的比喻:如果你有一个线[0,1],可以认为产生从1到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根据。

例如,对于1 P_1 = 0.1,2 P_2 = 0.4,3 P_3 = 0.2和4 P_4 = 0。3可以使用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中。

+0

您有一个好点。这与我的解决方案非常相似,但范围实际上可以在任何范围内使用,我想,只要比率是正确的。如果您的百分比和随机数生成器已经在该范围内,则设置范围在0到1之间非常好。 – mltsy 2012-04-12 20:36:48

1

制作一个数组有100个元素,用-1到6填充它取决于每个需要的重量。例如,如果您需要-1来命中15%,则可以用-1来填充15个元素。 现在生成一个从1到100的随机数,只需查看数组,就可以得到实际的结果加权。

+0

不适用于小数百分比,比如0.5% – SirGuy 2012-04-12 21:10:48

+0

,因为他正在进行文本基础游戏,我认为整数百分比就足够了,除非他另有说明。这也应该为高频率使用提供良好的性能。 – pizza 2012-04-12 21:34:44

+0

同意,我不是说你的方法是无效的,只是有一个警告 – SirGuy 2012-04-12 22:28:23

相关问题