我可以用c生成两个数字之间的随机数。
arc4random()%(high-low+1)+low;
然后现在我的要求是......我想要一个罕见的数字....这意味着如果
高= 5, 低= 1, 和罕见= 3,
比3更少出现比1,2,4和5 ......
由于
答案 0 :(得分:26)
您可以使用表格来计算最终掷骰,类似于笔和纸RPG执行相同类型的计算:
Roll 1 D 21(很可能是代码)。
此选项的优点是您可以深入了解您正在处理的确切概率。您可以感觉到每个数字的确切罕见或常见,并且与其他数字相比,您可以对每个数字的常见程度进行细粒度控制。
您还可以使用分数来生成表格。使用Least Common Multiple确定公共基础。该基数是您需要的最大随机数。然后,将所有分数按照相似的条件。使用生成的分子来确定表中每个数字的范围大小。
使用这种自动化解决方案,输入数字相互之间非常容易理解。 E.g:
这将生成如下表格:
LCM = 20
关于LCM的更多内容:http://en.wikipedia.org/wiki/Least_common_multiple
答案 1 :(得分:11)
一个易于理解的选项:
还有其他替代方法只需要你生成一个数字,但上面的感觉就像是最简单的编写和理解。
答案 2 :(得分:5)
您可以根据概率创建一个包含数字的数组:
list = (1, 1, 2, 2, 3, 4, 4, 5, 5);
return list.itemAtIndex(random() % list.count());
这不是很优雅,但如果概率变得更复杂,它可以轻松扩展。
答案 3 :(得分:1)
所有概率的总和必须为1.现在我们在这里使用有限范围内的离散概率进行处理,因此我们在(这里)查看具有某种分布的5种可能性,称之为p1,p2,p3,p4和p5的总和为1.
f0 = 0 f1 = p1 f2 = f1 + p2 f3 = f2 + p3 f4 = f3 + p4 f5 = f4 + p5,必须为1
生成一个从0到1的随机数,我们假设它不能完全是1.查看适合其上限的f值,即随机事件的值。也许
f1 = 0.222 f2 = 0.444 f3 = 0.555 f4 = 0.777 f5 = 1
如果您的随机数为0.645,则表示您已生成4事件。 有了上述内容,您生成3的机会比其他任何机会少一半。我们可以减少它的可能性,例如:
f1 = 0.24 f2 = 0.48 f3 = 0.52 f4 = 0.76 f5 = 1
其他人只有0.24,而且只有0.04。答案 4 :(得分:1)
让我们来看看。首先,我们使用srand()函数为随机化器播种。基本上,计算机可以根据提供给srand()的数字生成随机数。如果给出相同的种子值,则每次都会生成相同的随机数。
因此,我们必须使用始终在变化的值为随机数发生器播种。我们通过使用time()函数向其提供当前时间的值来实现此目的。
现在,当我们调用rand()时,每次都会产生一个新的随机数。
#include<stdio.h>
int random_number(int min_num, int max_num);
int main(void) {
printf("Min : 1 Max : 30 %d\n",random_number(0,5));
printf("Min : 100 Max : 1000 %d\n",random_number(100,1000));
return 0;
}
int random_number(int min_num, int max_num)
{
int result=0,low_num=0,hi_num=0;
if(min_num<max_num)
{
low_num=min_num;
hi_num=max_num+1; // this is done to include max_num in output.
}else{
low_num=max_num+1;// this is done to include max_num in output.
hi_num=min_num;
}
srand(time(NULL));
result = (rand()%(hi_num-low_num))+low_num;
return result;
}
答案 5 :(得分:0)
while true
generate a random number
if it's not the rare number, return it
generate a second random number - say from 1 to 100
if that second number's <= the percentage chance of the rare number compared to the others, return the rare number
注意:对于常见情况或返回非稀有数字,这是快速的。