如何让rand()更有可能选择某些数字?

时间:2010-08-28 21:09:48

标签: objective-c c random

是否可以使用rand()或任何其他伪随机生成器来挑选随机数,但它是否更有可能选择用户提供的某些数字?换句话说,是否有一种方法,使用rand()或其他东西来选择一个伪随机数,但是能够调整获得某些结果的几率,以及如果可能的话你如何做到这一点。

顺便说一句,我只想问一下如何更改rand()输出的数字,而不是如何获取用户输入。

8 个答案:

答案 0 :(得分:8)

嗯,你的问题有点模糊......但是如果你想从0到100之间选择一个数字但是偏向(例如)43和27,你可以选择[0,102]范围内的数字。并且将地图101到43和102到27.这实际上取决于你想要投入多少偏见,你的范围等等。

答案 1 :(得分:3)

你想要一个rand()的均匀密度和你想要的概率密度之间的映射函数。映射函数可以通过许多不同的方式完成。

答案 2 :(得分:1)

您当然可以使用任何随机数生成器来扭曲结果。 C#中的示例,因为我不知道objective-c语法。我假设rand()返回一个0和1,0之间的数字,包括0和1。理解idear并将代码转换为任何其他语言应该很容易。

 /// <summary>
 /// Dice roll with a double chance of rolling a 6.
 /// </summary>
 int SkewedDiceRoll()
 {
     // Set diceRool to a value from 1 to 7.
     int diceRool = Math.Floor(7 * rand()) + 1;

     // Treat a value of 7 as a 6.
     if (diceRoll == 7)
     {
         diceRoll = 6;
     }

     return diceRoll;
 }

答案 3 :(得分:1)

这不太难......

只需创建一个包含所有可能数字的数组,然后使用额外数字填充数组,以便更频繁地生成数据。

即:

阵列( '1',1' , '1', '1', '2', '3', '4', '4');

显然当你查询那个数组时,它最多会调用“1”,然后是“4”

答案 4 :(得分:1)

  

换句话说,是否有一种方法,使用rand()或其他东西来选择一个伪随机数,但能够调整获得某些结果的几率,以及如果可能的话你如何做到这一点。

为简单起见,让我们使用drand48()返回“在[0.0,1.0)区间内均匀分布的值”。

要使值更接近可能出现的值,请应用偏斜函数log2()

log2( drand48() + 1.0 );  // +1 since log2() in is [0.0, 1.0) for values in [1.0, 2.0)

为了使更接近于零的值更可能出现,请使用例如exp()

(exp(drand48()) - 1.0) * (1/(M_E-1.0));  // exp(0)=1, exp(1)=e

通常你需要创建一个函数,它将来自随机函数的均匀分布的值映射到不同地,非均匀地分布的值。

答案 5 :(得分:0)

根据定义,随机数发生器的输出是随机的,这意味着每个数字下一次都可能发生(1/10几率),你不应该影响结果。

当然,伪随机生成器会创建一个输出,该输出始终遵循给定输入种子的相同模式。因此,如果您知道种子,那么您可能对输出序列有所了解。当然,您可以使用模数运算符来处理从生成器输出的数字集(例如,%5 + 2以生成从2到7的数字)。

答案 6 :(得分:0)

除了凯文建议的内容之外,您可以将常规的数字组(范围广泛)切割成许多较小的范围,并从您认为有利的范围中选择RNG。您可以按特定顺序访问这些范围,或者,您可以按随机顺序访问它们(但我可以假设这不是您想要的。)因为您在宽范围内使用手动指定的范围对于元素,你可能会看到你想要的数字比其他数字更多。当然,这就是我接近它的方式,看起来似乎并非那么理性。

祝你好运。

答案 7 :(得分:0)

您可以使用以下方法 这个例子有50%的机会产生你最喜欢的一个数字

int[] highlyProbable = new int[]{...};

public int biasedRand() {
    double rand = rand();
    if (rand < 0.5) {
        return highlyProbable[(int)(highlyProbable.length * rand())];
    } else {
        return (int)YOUR_RANGE * rand();
    }
}