4

我试图找出一种方法来创建在短序列上“感觉”随机的随机数。这是一个问答游戏,有四种可能的选择,软件需要在四个位置中选择一个来放置正确答案,然后再用干扰项填充其他三个位置。

显然,arc4random % 4将在长序列中产生足够多的随机结果,但在短序列中完全有可能(并且经常发生!)有五个或六个相同数字连续返回。这是我要避免的。

我也不想简单地说“永远不要选择同一个方块两次”,因为这会导致除了第一个问题之外的每个问题只有三个可能的答案。目前我正在做这样的事情:

bool acceptable = NO;
do {
  currentAnswer = arc4random() % 4;
  if (currentAnswer == lastAnswer) {
    if (arc4random() % 4 == 0) {
      acceptable = YES;
    }
  } else {
    acceptable = YES;
  }
} while (!acceptable);

我忽略了这个问题有更好的解决方案吗?

4

4 回答 4

3

您填充一系列结果,然后将其随机排列,然后按该顺序分配它们。

因此,只需 8 个问题:

answer_slots = [0,0,1,1,2,2,3,3]

shuffle(answer_slots)

print answer_slots
 [1,3,2,1,0,2,3,0]
于 2010-06-23T06:38:18.900 回答
3

如果您的问题是如何currentAnswer非迭代地使用示例的概率进行计算,Guffa 有您的答案。

如果问题是如何在不违反等概率的情况下避免随机聚类,并且您知道列表长度的上限,那么请考虑以下类似于 un-sorting 的算法:

from random import randrange
# randrange(a, b) yields a <= N < b

def decluster():
    for i in range(seq_len):
        j = (i + 1) % seq_len
        if seq[i] == seq[j]:
            i_swap = randrange(i, seq_len) # is best lower bound 0, i, j?
            if seq[j] != seq[i_swap]:
                print 'swap', j, i_swap, (seq[j], seq[i_swap])
                seq[j], seq[i_swap] = seq[i_swap], seq[j]

seq_len = 20
seq = [randrange(1, 5) for _ in range(seq_len)]; print seq
decluster(); print seq
decluster(); print seq

与实际工作 Python 代码的任何关系纯属巧合。我很确定保留了先验概率,并且它似乎确实破坏了集群(并且偶尔会添加一些)。但是我很困所以这只是为了娱乐目的。

于 2010-06-23T06:57:29.153 回答
0

要将重复数字的概率降低 25%,您可以选择 0 到 3.75 之间的随机数,然后旋转它,使 0.75 最终出现在上一个答案中。

为避免使用浮点值,您可以将因子乘以四:

伪代码(其中/是整数除法):

currentAnswer = ((random(0..14) + lastAnswer * 4) % 16) / 4
于 2010-06-23T05:47:52.360 回答
0

设置一个加权数组。假设最后一个值是 2。创建一个这样的数组:

array = [0,0,0,0,1,1,1,1,2,3,3,3,3];

然后在数组中选择一个数字。

newValue = array[arc4random() % 13];

现在切换到使用数学而不是数组。

newValue = ( ( ( arc4random() % 13 ) / 4 ) + 1 + oldValue ) % 4;

对于 P 可能性和权重0<W<=1使用:

newValue = ( ( ( arc4random() % (P/W-P(1-W)) ) * W ) + 1 + oldValue ) % P;

对于 P=4 和 W=1/4,(P/WP(1-W)) = 13。这表示最后一个值将是其他值的 1/4。

如果您完全消除了最近的答案,它将与经常出现的最近的答案一样引人注目。我不知道你觉得什么重量合适,但 1/4 是一个很好的起点。

于 2010-06-23T06:28:32.243 回答