是否可以使用rand()或任何其他伪随机生成器来挑选随机数,但它是否更有可能选择用户提供的某些数字?换句话说,是否有一种方法,使用rand()或其他东西来选择一个伪随机数,但是能够调整获得某些结果的几率,以及如果可能的话你如何做到这一点。
顺便说一句,我只想问一下如何更改rand()输出的数字,而不是如何获取用户输入。
答案 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();
}
}