我正在写一些代码来使用随机数来创建钟形曲线。
基本方法如下:
创建一个2001整数数组。
对于某些重复次数,请执行以下操作:

• Start with a value of 1000 (the center-value)
• Loop 1000 times
    • Generate a random number 0 or 1. If the random number is zero, subtract 1 from the value. If it's 1, add 1 to the value.
• Increment the count in my array at the resulting index value.

所以1000次,我们随机加1或从1000的起始值减去1。平均来说,我们会像平常一样加1减1,所以结果应该集中在1000左右。大于或小于1000的值应该越来越少出现。索引0或索引1处的值将需要连续1000次“掷硬币”以获得相同的结果。。。这是一个不太可能发生的事件。
这是我想出的代码,用C语言编写,带有一个薄的目标C包装:
#import "BellCurveUtils.h"

@implementation BellCurveUtils

#define KNumberOfEntries 1000
#define KPinCount 1000
#define KSlotCount (KPinCount*2+1)

 static int bellCurveData[KSlotCount];


+(void) createBellCurveData;
{
  NSLog(@"Entering %s", __PRETTY_FUNCTION__);
  NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];

  int entry;
  int i;
  int random_index;

  //First zero out the data
  for (i = 0; i< KSlotCount; i++)
    bellCurveData[i] = 0;

  //Generate KNumberOfEntries entries in the array
  for (entry =0; entry<KNumberOfEntries; entry++)
  {
    //Start with a value of 1000 (center value)
    int value = 1000;

    //For each entry, add +/- 1 to the value 1000 times.
    for (random_index = 0; random_index<KPinCount; random_index++)
    {
      int random_value = arc4random_uniform(2) ? -1: 1;
      value += random_value;
    }
    bellCurveData[value] += 1;
  }
  NSTimeInterval elapsed = [NSDate timeIntervalSinceReferenceDate] - start;
  NSLog(@"Elapsed time = %.2f", elapsed);

  int startWithData=0;
  int endWithData=KSlotCount-1;
  for (i = 0; i< KSlotCount; i++)
  {
    if (bellCurveData[i] >0)
    {
      startWithData = i;
      break;
    }
  }
  for (i = KSlotCount-1; i>=0 ; i--)
  {
    if (bellCurveData[i] >0)
    {
      endWithData = i;
      break;
    }
  }

  for (i = startWithData; i <= endWithData; i++)
    printf("value[%d] = %d\n", i, bellCurveData[i]);
}

@end

代码确实生成了钟形曲线。但是,具有奇数索引的数组项都为零。
以下是一些示例输出:
value[990] = 23
value[991] = 0
value[992] = 22
value[993] = 0
value[994] = 20
value[995] = 0
value[996] = 25
value[997] = 0
value[998] = 37
value[999] = 0
value[1000] = 23
value[1001] = 0
value[1002] = 26
value[1003] = 0
value[1004] = 20
value[1005] = 0
value[1006] = 28
value[1007] = 0
value[1008] = 23
value[1009] = 0
value[1010] = 26

我已经一行一行地检查了这个代码,不明白这是为什么。当我在调试器中单步执行它时,我得到的值会以单个步骤反弹,从1000开始,下降到999,递增到1001,以及各种偶数和奇数值。然而,在1000次迭代之后,value的结果总是均匀的。我错过了什么?!?
我意识到这不是一个典型的发展问题,但我被难住了。我看不出我做错了什么。有人能解释一下这些结果吗?

最佳答案

//For each entry, add +/- 1 to the value 1000 times.
for (random_index = 0; random_index<KPinCount; random_index++)
{
  int random_value = arc4random_uniform(2) ? -1: 1;
  value += random_value;
}

对于此循环的任意两次迭代,有三种潜在结果:
随机值均为零,此时“值”减少2。
随机值是两次中的一次,在这种情况下,“值”增加2。
随机值一次为零,一次为一,此时“值”不变。
因此,如果循环运行偶数次(即KPinCount是偶数),则“value”的奇偶性将永远不变。因为它以偶数(1000)开头,所以它以偶数结尾。
编辑:如果您想解决问题,但保持相同的基本方法,那么与其从value=1000开始运行1000次迭代,在其中添加或减去一次,不如从value=0开始运行2000次迭代,在其中添加一次或零次。我会把这个作为评论发布到上面的讨论中,但是由于我刚刚注册,所以不能评论。

关于c - 生成钟形曲线的代码仅在偶数索引处创建数据。为什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23617936/

10-15 13:50