全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
5996 8
2014-10-14
想着可以用while,程序如下:
l<-1
while(l<=10000){
r<-runif(100)
n<-NULL
for(i in 1:10000)
{if(sum(r[1:i])>1)
n[i]<-i
}
n<-n[!is.na(n)]
N<-c(N,min(n))
l<-l+1
}
目的是产生10000个N
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-10-14 14:51:14
复制代码


些许错
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-14 15:33:36
yywan0913 发表于 2014-10-14 14:51
些许错
非常感谢!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-16 19:50:48
我看你的程序看了半天,或许你是这个意思:做10000次实验,每次实验都产生一个足够长的均匀分布序列,其中每个数的取值范围在0到1之间,考察这一序列从第1位开始,累积到第几个数会使累计值超过1(一般累积到第4或第5个数就已经超过1了),假设该数是序列中第X个数字(一般而言X在2到5之间),那么该次实验的结果就是X——10000次实验,产生10000个整数X(不尽相同),将这10000次结果存储到向量N中,这就是你所写程序的目的。如果我没有理解错,那么按我的写法会是:

N = NULL
for (i in 1:10000) N = append(N, sum(cumsum(runif(20)) <= 1) + 1)

这就是全部程序,写完了,就这两行。注意:

(1)cumsum()为累和函数,cumsum(c(1,3,5,7))的结果是(1,4,9,16)
(2)x = append(x, ...)的写法与x = c(x, ...)的写法等效
(3)向量y <= 1 这个表达式会产生一个向量,该向量中第 k 个分量是y中第 k 个数与1比较所得的布尔值结果,小于等于1为TRUE,反之为FALSE。
(4)类似(TRUE,FALSE,TRUE,TRUE,...)这样的向量是可以求和的,求和时系统会将TRUE当作1值,将FALSE当作0值,并计算结果
(5)你在每次实验时都产生100个服从均匀分布的随机数,这太多了,一般而言累积到第5位,累计值就会超过1,我放宽到每次产生20个数都已经是严重过剩了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-16 20:37:40
好吧,先不看上面的那个简短程序,毕竟,不知道 cumsum 函数的人可能无法将程序有效压缩。现在回过头分析一下你的程序片段:

for(i in 1:10000)
{if(sum(r[1:i])>1)
n[ i ] <- i
}
n<-n[!is.na(n)]
N<-c(N,min(n))

循环变量 i 的范围写错,应该是1:100(因为向量 r 总共只有100个元素),这个2楼已经指出。但是通观你的程序,你实际不需要针对每个 i 都计算累积值,累计值一旦超过数字1,后续计算就没有必要进行了 。

循环语句中有个很重要的控制语句——break,它的用处是退出循环!

以上程序片段可以改为:

for (i in 1:100) if (sum(r[1:i]) > 1) break
N = c(N, i)

注意,当循环遇到break语句终止后,i 值就是刚好让均匀分布序列累积值超过1值的那个位数!所以直接将 i 值归并到向量N中即可。这样你的完整程序就可写为:

N = NULL
for (l in 1:10000) {
  r = runif(100)
  for (i in 1:100) if (sum(r[1:i]) > 1) break
  N = c(N, i)
}

结束。虽然没有2行程序那么简短,但也比原先压缩不少,而且运行也省时。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-17 09:23:20
meishanjia1900 发表于 2014-10-16 20:37
好吧,先不看上面的那个简短程序,毕竟,不知道 cumsum 函数的人可能无法将程序有效压缩。现在回过头分析一 ...
非常感谢您的回复,问题实际是这样的:
U1,U2,。。。是(0,1)上的随机变量,N=min(n: sum(U[1:n])>1),目的要产生10000个N估计E(N)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群