一个关于均匀取数的问题!

jgloving 2007-11-27 04:15:06
问题是这样:
对于一组数0...800(例如)给定一个百分比,20%(例如)
如果获得这组数的均匀采样801*20%?
谢谢
...全文
116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
malligator 2008-01-28
  • 打赏
  • 举报
回复
import java.util.Set;
import java.util.TreeSet;

public class GetNumber {
public static void main(String[] args) {
System.out.println(getNumbers(0, 800, (int)((800-1+1) * 0.20)));
}

static Set<Integer> getNumbers(int minNum, int maxNum, int account){
int len = maxNum - minNum;

// 获取数据
Set<Integer> nums = new TreeSet<Integer>();
while (nums.size() < account) {
int r = (int) (Math.random() * len + 1);
nums.add(new Integer(minNum + r));
}

return nums;
}


}
冰冻木马 2007-12-19
  • 打赏
  • 举报
回复
/*
把给定的数组随机排序的类
冰冻木马QQ57629776 Email:hcma@qq.com 2007年12月
*/
public class ArraryToRand
{
int [] toRandArrary;
ArraryToRand(final int arrary[]) //会引起原来数组的更新
{
int temp=0,j;
toRandArrary=arrary;

for(int i=0;i<arrary.length;i++) //随机交换数组元素,使数组随机排序;
{
j=(int)(Math.random()*toRandArrary.length);
temp=toRandArrary[i];
toRandArrary[i]=toRandArrary[j];
toRandArrary[j]=temp;
}
}
/*
供程序测试用
*/
//以下是1-800的有序数,经过以上类的排序后将成为无序数组
public static void main(String [] args)
{
int [] a=new int[800]; //分配一个800的整形数组
for(int i=0;i<a.length;i++)
a[i]=i+1;
int tem1=0,tem2=0,tem3=0,tem4=0,tem5=0,tem=0,count=0;
System.out.println("随机取样中...\n"
+ "请耐心等待(如果运气不好,可能要等很久哦!)\n"
+"友情提示:可按Ctrl+C终止程序然后多测试几次,有时只要一秒钟就可以的哦!");
while(true)
{
ArraryToRand myarrary=new ArraryToRand(a);
for(int i=0;i<160;i++)
{
tem1=tem1+a[i];//取得0-159号数的和
tem2=tem2+a[i+160];//取得160-319号数的和
tem3=tem3+a[i+160*2];
tem4=tem4+a[i+160*3];
tem5=tem5+a[i+160*4];
}
if(
(tem1-tem2)<=800*0.2 //看0-159号数的和 是否与 160-319号数是否相差过大,如果过大则生重先排序取样
&&(tem1-tem3)<=800*0.2
&&(tem1-tem4)<=800*0.2
&&(tem1-tem5)<=800*0.2
&&(tem2-tem3)<=800*0.2
&&(tem2-tem4)<=800*0.2
&&(tem2-tem5)<=800*0.2
&&(tem3-tem4)<=800*0.2
&&(tem3-tem5)<=800*0.2
&&(tem4-tem5)<=800*0.2
) break;//如果取样成功,则退出程序
else
count++;

}
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
System.out.println("共进行了"+count+"次的取样");
}
}
//请直接把以上文件保存为ArraryToRand.java然后编译、运行,看看能否满足你的要求。
冰冻木马 2007-12-19
  • 打赏
  • 举报
回复
/*
把给定的数组随机排序的类
冰冻木马QQ57629776 Email:hcma@qq.com 2007年12月
*/
public class ArraryToRand
{
int [] toRandArrary;
ArraryToRand(final int arrary[]) //会引起原来数组的更新
{
int temp=0,j;
toRandArrary=arrary;

for(int i=0;i<arrary.length;i++) //随机交换数组元素,使数组随机排序;
{
j=(int)(Math.random()*toRandArrary.length);
temp=toRandArrary[i];
toRandArrary[i]=toRandArrary[j];
toRandArrary[j]=temp;
}
}
/*
供程序测试用
*/
//以下是1-800的有序数,经过以上类的排序后将成为无序数组
public static void main(String [] args)
{
int [] a=new int[800]; //分配一个800的整形数组
for(int i=0;i<a.length;i++)
a[i]=i+1;
int tem1=0,tem2=0,tem3=0,tem4=0,tem5=0,tem=0,count=0;
System.out.println("随机取样中...\n"
+ "请耐心等待(如果运气不好,可能要等很久哦!)\n"
+"友情提示:可按Ctrl+C终止程序然后多测试几次,有时只要一秒钟就可以的哦!");
while(true)
{
ArraryToRand myarrary=new ArraryToRand(a);
for(int i=0;i<160;i++)
{
tem1=tem1+a[i];//取得0-159号数的和
tem2=tem2+a[i+160];//取得160-319号数的和
tem3=tem3+a[i+160*2];
tem4=tem4+a[i+160*3];
tem5=tem5+a[i+160*4];
}
if(
(tem1-tem2)<=800*0.2 //看0-159号数的和 是否与 160-319号数是否相差过大,如果过大则生重先排序取样
&&(tem1-tem3)<=800*0.2
&&(tem1-tem4)<=800*0.2
&&(tem1-tem5)<=800*0.2
&&(tem2-tem3)<=800*0.2
&&(tem2-tem4)<=800*0.2
&&(tem2-tem5)<=800*0.2
&&(tem3-tem4)<=800*0.2
&&(tem3-tem5)<=800*0.2
&&(tem4-tem5)<=800*0.2
) break;//如果取样成功,则退出程序
else
count++;

}
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
System.out.println("共进行了"+count+"次的取样");
}
}
//已经测试,请看看能否满足你的要求。
seaforce 2007-11-27
  • 打赏
  • 举报
回复
问问题问清楚点
  • 打赏
  • 举报
回复
不能理解“均匀”是什么,是随机呢,还是像楼上所说的间隔平均呢?不是很明白~~
doctormoney 2007-11-27
  • 打赏
  • 举报
回复
先算出这个数组的个数n,然后用n×20%得出取样后的数据个数m。n÷m即为取值间隔数。每个间隔取一个数就可以了吧。
ustbsjl 2007-11-27
  • 打赏
  • 举报
回复
问题描述不清

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧