楼主: vickey_chang
5527 8

[问答] R中可以把某段程序重复运行制定的次数吗? [推广有奖]

  • 0关注
  • 0粉丝

本科生

95%

还不是VIP/贵宾

-

威望
0
论坛币
429 个
通用积分
0.3000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
131 点
帖子
54
精华
0
在线时间
130 小时
注册时间
2008-4-25
最后登录
2024-4-29

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
想着可以用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
二维码

扫码加我 拉你入群

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

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

关键词:while Hil 程序

沙发
yywan0913 在职认证  发表于 2014-10-14 14:51:14 |只看作者 |坛友微信交流群
  1. l=1;N=c()
  2. while(l<=10000){
  3. r<-runif(100)
  4. n<-NULL
  5. for(i in 1:100)
  6. {if(sum(r[1:i])>1)
  7. n[i]<-i
  8. }
  9. n<-n[!is.na(n)]
  10. N<-c(N,min(n))
  11. l<-l+1
  12. }
复制代码


些许错
已有 1 人评分经验 论坛币 收起 理由
李会超 + 12 + 12 精彩帖子

总评分: 经验 + 12  论坛币 + 12   查看全部评分

使用道具

藤椅
vickey_chang 发表于 2014-10-14 15:33:36 |只看作者 |坛友微信交流群
yywan0913 发表于 2014-10-14 14:51
些许错
非常感谢!!

使用道具

板凳
meishanjia1900 发表于 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个数都已经是严重过剩了

使用道具

报纸
meishanjia1900 发表于 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行程序那么简短,但也比原先压缩不少,而且运行也省时。

使用道具

地板
vickey_chang 发表于 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)

使用道具

7
vickey_chang 发表于 2014-10-17 09:28:32 |只看作者 |坛友微信交流群
meishanjia1900 发表于 2014-10-16 20:37
好吧,先不看上面的那个简短程序,毕竟,不知道 cumsum 函数的人可能无法将程序有效压缩。现在回过头分析一 ...
昨晚去上课了,刚看到回复,谢谢了!

使用道具

8
vickey_chang 发表于 2014-10-17 09:33:28 |只看作者 |坛友微信交流群
meishanjia1900 发表于 2014-10-16 20:37
好吧,先不看上面的那个简短程序,毕竟,不知道 cumsum 函数的人可能无法将程序有效压缩。现在回过头分析一 ...
给我很多启示,多谢了!!!

使用道具

9
gssdzc 在职认证  发表于 2014-10-17 20:41:05 |只看作者 |坛友微信交流群
非常感谢分享。。。。。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-30 16:39