作业帮 > 综合 > 作业

EXCEL中随机抽样,要求输入一个数字如256从中随机抽取百分之十的数字,即27个数字,在1-10中抽取1个

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/15 03:33:46
EXCEL中随机抽样,要求输入一个数字如256从中随机抽取百分之十的数字,即27个数字,在1-10中抽取1个
11-20抽一个,21-30抽一个依此类推,240-256中抽两个,要求抽取的数字不重复,有大侠会么?
你输入的这个数字,跟你随机抽取的这个范围比如256有什么关系?是不是你输入10000,你就要从1到10000抽取1000个随机数字?还是每次不能重复?
再问: 从10000里抽1000个数字,1-10一个,11-20一个....9990-10000一个,,就是想平均点而且这样取肯定没重复的。上面那个是240-256中取两个所以要求不重复
再答: 相当有难度啊,我有空了帮你想想,因为你这个输入的数据不定,随机取的数字也就可能量很大
再问: (⊙o⊙)嗯,谢谢啊!
再答: 好了,你要抽入的范围如256写在 A1,把我的代码复制到VBA编辑器里,插入一个按钮指定代码,然后不停的点按钮就可以看见数字是随机变的,都显示在B列 从以10为单位的范围内返回 Sub rr() Dim i%, k%, j%, a%, arr() For i = 1 To Int(Range("a1") / 10) + 1 a = Int(Rnd() * 10 + 1) + (i - 1) * 10 ReDim Preserve arr(1 To i) arr(i) = a Next If arr(UBound(arr)) > Range("a1") Then arr(UBound(arr)) = Range("a1") Range("b1").Resize(UBound(arr), 1) = Application.Transpose(arr) End Sub
再问: 这个取数可以四舍五入么?就是300就是取的30个,306就是取31个,这个方法300也是取31个,请问要怎么修改呢?谢谢
再答: Sub rr() Dim i%, a%, arr() Range("b:b").ClearContents For i = 1 To Application.Round(Range("a1") / 10, 0) a = Int(Rnd() * 10 + 1) + (i - 1) * 10 ReDim Preserve arr(1 To i) arr(i) = a Next If arr(UBound(arr)) > Range("a1") Then arr(UBound(arr)) = Range("a1") Range("b1").Resize(UBound(arr), 1) = Application.Transpose(arr) End Sub
再问: 恩恩,,很好,问下如果要求进一怎么修改,就是300还是取30,,301就取31个,,大神,,快成功了- -求帮忙,再顺便问一下Range("b:b").ClearContents这一句是什么作用
再答: 只需要把round 改成roundup就行了嘛,那一句是清空B列的,如果没有这一句你第一A1的数字是300,下次变成100了,11行以后的数字还是300的,所以必须要运行程序的时候清空B列 Sub rr() Dim i%, a%, arr() Range("b:b").ClearContents For i = 1 To Application.RoundUp(Range("a1") / 10, 0) a = Int(Rnd() * 10 + 1) + (i - 1) * 10 ReDim Preserve arr(1 To i) arr(i) = a Next If arr(UBound(arr)) > Range("a1") Then arr(UBound(arr)) = Range("a1") Range("b1").Resize(UBound(arr), 1) = Application.Transpose(arr) End Sub
再问: 额,,试验了下,发现个小问题- -比如301的时候301必然出现- -能不能就是不能整除的时候是290-301取两个数,如你输入301-309的时候都是290-这个数之间取两个数- -话说能加下联系方式么?我QQ:523148248,求大神指导
再答: 你这样可能会取重复的,290-300是是一个段,300-301还是 290-301,有重复区域,我现在的程序是,当是301~309之间的时候 比如:306吧 ,上边算式取出的数字可能超过306,这个时候我就让大于306的数字返回306!我感觉比你所说的合理
再问: 额,,我是说本来290-300不是一个段么?如果输入的数不是整数如301,那前面都一样,280-290取一个然后290-301取两个,因为301就一个数这样出现的概率就是100%了,,所以我想把301放到前面一段然后直接从前面一段取两个数字。这样可以做到么?谢谢
再答: 你真是变化多端啊 Sub rr() Dim i%, a%, arr(), b%, c%, d% Range("b:b").ClearContents For i = 1 To Int(Range("a1") / 10) a = Int(Rnd() * 10 + 1) + (i - 1) * 10 ReDim Preserve arr(1 To i) arr(i) = a Next line: b = arr(UBound(arr)) Mod 10 c = (Range("a1") - (UBound(arr) - 1) * 10) * Rnd() + 1 d = (UBound(arr) - 1) * 10 If b = c Then GoTo line Else ReDim Preserve arr(1 To UBound(arr) + 1) arr(UBound(arr)) = c + d End If Range("b1").Resize(UBound(arr), 1) = Application.Transpose(arr) End Sub