使用一个罕见数字生成两个数字之间的随机数

时间:2010-10-19 09:09:16

标签: c random

我可以用c生成两个数字之间的随机数。

arc4random()%(high-low+1)+low;

然后现在我的要求是......我想要一个罕见的数字....这意味着如果

高= 5, 低= 1, 和罕见= 3,

比3更少出现比1,2,4和5 ......

由于

6 个答案:

答案 0 :(得分:26)

您可以使用表格来计算最终掷骰,类似于笔和纸RPG执行相同类型的计算:

Roll 1 D 21(很可能是代码)。

  • 如果你得到1-5,则算作1
  • 如果你得到6-10,则计为2
  • 如果你得到11-15,则计为4
  • 如果你得到16-20,就算是5
  • 如果你得到21,则计为3

此选项的优点是您可以深入了解您正在处理的确切概率。您可以感觉到每个数字的确切罕见或常见,并且与其他数字相比,您可以对每个数字的常见程度进行细粒度控制。

您还可以使用分数来生成表格。使用Least Common Multiple确定公共基础。该基数是您需要的最大随机数。然后,将所有分数按照相似的条件。使用生成的分子来确定表中每个数字的范围大小。

使用这种自动化解决方案,输入数字相互之间非常容易理解。 E.g:

  • 1/4 for 1
  • 1/4 for 2
  • 1/4 for 4
  • 1/5 for 5
  • 1/20 for 3

这将生成如下表格:

LCM = 20

  • 1-5 = 1(如条款 - 5/20)
  • 6-10 = 2(5/20)
  • 11-15 = 4(5/20)
  • 16-19 = 5(4/20)
  • 20 =(1/20)

关于LCM的更多内容:http://en.wikipedia.org/wiki/Least_common_multiple

答案 1 :(得分:11)

一个易于理解的选项:

  • 生成一个数字以确定您是否要返回稀有数字(例如,生成[0-99]范围内的数字,如果为0,则返回稀有数字
  • 如果你进入这一步,你将返回一个非稀有数字:继续生成正常范围内的数字,直到你获得任何非稀有数字,然后返回

还有其他替代方法只需要你生成一个数字,但上面的感觉就像是最简单的编写和理解。

答案 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

注意:对于常见情况或返回非稀有数字,这是快速的。