gpt4 book ai didi

生成钟形曲线的代码仅在偶数索引处创建数据。为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:07 24 4
gpt4 key购买 nike

我正在编写一些代码来使用随机数来创建钟形曲线。

基本做法如下:

创建一个包含 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 次,我们从 1000 的起始值中随机加 1 或减 1。平均而言,我们加 1 和减 1 的频率差不多,所以结果应该以 1000 为中心。值大于或小于1000应该越来越少了。索引 0 或索引 1 处的值需要连续 1000 次“抛硬币”得到相同的结果……非常不太可能发生但仍有可能发生的事件。

这是我想出的代码,用 C 语言编写,带有一个薄的 Objective 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 的结果始终 为偶数。我在这里错过了什么?!?

我意识到这不是一个典型的 SO 开发问题,但我很困惑。我看不出我做错了什么。有人可以解释这些结果吗?

最佳答案

//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;
}

对于此循环的任意两次迭代,存在三种可能的结果:

  1. random_value 两次都为零,在这种情况下“值”减少 2。
  2. random_value 两次都是 1,在这种情况下“value”增加 2。
  3. random_value 一次为零,一次为一,在这种情况下“值”不变。

因此,如果循环运行了偶数次(即 KPinCount 为偶数),则“value”的奇偶性永远不会改变。由于它以偶数 (1000) 开头,因此以偶数结尾。

编辑:如果您想解决问题但保持相同的基本方法,那么与其从 value = 1000 开始并运行 1000 次迭代,在迭代中加或减 1,也许您可​​以从 value = 0 开始并运行 2000 次迭代,在其中添加 1 或 0。我本来可以将此作为对上述讨论的评论发布的,但由于我刚刚注册,所以不能发表评论。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com