Algorithm 长度N的概率是长度N-1概率的三分之一,而不是一半。这将提供更短的平均跑步长度,最长的跑步长度为5,因此对您来说“看起来更随机”。当然,对于那些习惯于处理投币顺序的人来说,这不会显得“随机”,因为他们会认为投币的时间太短。通过统计测试,你也可以很容易地判断出数字N的值与数字N-1的值相关

Algorithm 长度N的概率是长度N-1概率的三分之一,而不是一半。这将提供更短的平均跑步长度,最长的跑步长度为5,因此对您来说“看起来更随机”。当然,对于那些习惯于处理投币顺序的人来说,这不会显得“随机”,因为他们会认为投币的时间太短。通过统计测试,你也可以很容易地判断出数字N的值与数字N-1的值相关,algorithm,language-agnostic,random,Algorithm,Language Agnostic,Random,此代码使用至少log(81)=6.34“随机位”来生成平均1.44位的输出,因此比仅生成均匀分布的位要慢。但是它的速度不应该超过7/1.44=5倍,LFSR的启动速度非常快。线性反馈移位寄存器有多种变体,例如and,它们根据另一个LFSR的输出修改一个LFSR的输出 这些设计试图创建随机数,其中在一行中获得两个相同位的概率为0.5,在一行中获得三个相同位的概率为0.25,依此类推 当出现一系列相似的位时,应该可以链接两个LFSR以抑制或反转输出-第一个LFSR使用传统的原始多项式,第一个LFSR

此代码使用至少log(81)=6.34“随机位”来生成平均1.44位的输出,因此比仅生成均匀分布的位要慢。但是它的速度不应该超过7/1.44=5倍,LFSR的启动速度非常快。

线性反馈移位寄存器有多种变体,例如and,它们根据另一个LFSR的输出修改一个LFSR的输出

这些设计试图创建随机数,其中在一行中获得两个相同位的概率为0.5,在一行中获得三个相同位的概率为0.25,依此类推

当出现一系列相似的位时,应该可以链接两个LFSR以抑制或反转输出-第一个LFSR使用传统的原始多项式,第一个LFSR将输出馈送到第二个LFSR。第二个移位寄存器较短,没有原始多项式。相反,如果输出的所有位都相同,它被抽头以反转输出,因此任何运行都不能超过第二个移位寄存器的大小


显然,这破坏了输出的随机性——如果一行中有N位,那么下一位是完全可预测的。使用另一个随机源的输出来确定是否反转输出会破坏第二个移位寄存器-您将无法检测到它与一个随机源之间的差异。

请查看。我相信它有一些功能,正是你想要的。它们至少保证是随机位字符串。我不确定它们是否看起来是随机的,因为这更像是一个心理问题

真不敢相信没有人提到这一点: 如果您希望最长运行(周期)为2N次重复:

PeopleRandom()
{
    while(1)
    {
        Number = randomN_bitNumber();
        if(Number && Number != MaxN_BitNumber)
            return Number;
    }
}
这在抛掷量方面比使用32位等的方法有更好的效果

优点:

  • 您只能在2/2^N的时间内抛出值
  • N越大,效果越好

因为在中间位中没有用1分割值的值正好是一半,如果你能容忍小于一半的较大的最大运行,那么你可以用一个比你更大的N。使用调整参数控制每个新位与前一位匹配的概率。通过将概率设置为0.5以下,可以生成不太可能包含长时间重复位的序列(并且可以调整这种可能性)。设置p=0给出一个重复的1010101010序列;设置p=1给出了所有0或所有1的序列

下面是一些C#来演示:

double p = 0.3; // 0 <= p <= 1, probability of duplicating a bit

var r = new Random();
int bit = r.Next(2);    

for (int i = 0; i < 100; i++)
{
    if (r.NextDouble() > p)
    {
        bit = (bit + 1) % 2;
    }        

    Console.Write(bit);                
}

double p=0.3;//“看起来随机”的0位模式是(至少)最小化0或1的长序列的模式。4对每侧0的长序列失败。LFSR似乎产生低比特密度结果(例如,00..0001是LFSR的有效输出?这正是我要建议的。您可能只需在汇编中实现它,就可以更快地生成prn。@James:当选择正确的反馈位时,LFSR将在给定位大小中循环所有可能的值(0除外)。哪些数字排在第一位完全取决于您的种子。我想除了随机源之外,我还需要一些东西来将分布向较短的位序列倾斜。我想要了解的一半是关于“感知随机性”的其他指标。至少,必须避免长序列的0或1。似乎检查生成的数字可能比每位位置的随机数更无效。我想知道人们是否真的会认为典型的随机数生成器产生的结果是“非随机的”如果你用二进制显示。我希望你知道,排除“长时间运行”会显著降低随机性。显然,他不是在寻找随机数。他试图让数字“看起来”比随机数更随机。它可以是一组“批准的数字”(我在回答中提出的)中的真正随机样本。
#include <cstdlib>

class generator {
public:
   generator() : last_num(0), run_count(1) { }

   bool next_bit() {
      const bool flip = rand() > RAND_MAX / pow( 2, run_count);
                               // RAND_MAX >> run_count ? 
      if(flip) {
         run_count = 1;
         last_num = !last_num;
      } else
         ++run_count;

      return last_num;
   }
private:
   bool last_num;
   int run_count;
};
0111111011111110110001000101111001100000000111001010101101001000
loop
    get a random number
    output that many 1 bits
    get a random number
    output that many 0 bits
endloop
get a uniformly-distributed random number n from 1 to 81
if n is between 1 and 54, return 1
if n is between 55 and 72, return 2
if n is between 72 and 78, return 3
if n is between 79 and 80, return 4
return 5
PeopleRandom()
{
    while(1)
    {
        Number = randomN_bitNumber();
        if(Number && Number != MaxN_BitNumber)
            return Number;
    }
}
double p = 0.3; // 0 <= p <= 1, probability of duplicating a bit

var r = new Random();
int bit = r.Next(2);    

for (int i = 0; i < 100; i++)
{
    if (r.NextDouble() > p)
    {
        bit = (bit + 1) % 2;
    }        

    Console.Write(bit);                
}