C语言程序:从N个数中随机取出100个不同的数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言程序:从N个数中随机取出100个不同的数相关的知识,希望对你有一定的参考价值。

/**你题目中的N个数至少得大于100吧.下面的程序N个数是随机生成
你的N个数是??? 同时这个程序有错误的话请告诉我.
*/
/*
*从N个数中随机取出100个不同的数
*@author:banxi1988
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(void)
int numbers[4096];
int nums[100];
int num;
int count=0;
int i = 0;
int j = 0;
int flag = 0;
int index= 0;
srand((unsigned)time(NULL));
/**随机生成0到8192的数放到数组numbers当中*/
for(i = 0; i < 4096; i++)
numbers[i] = rand()%8192;
//for:

/**从numbers数组当中的数中随机取100个不同的数*/
for(i = 0; i< 100;i++)
flag = 1;
do
index = rand()%4096;
num = numbers[index];
for(j = 0; j < count; j++)
if(num==nums[j])
flag = 0;
break;
//:if
//:for
while(flag==0);
nums[count++]=num;

///for:

printf("从0到8192中产生的100个随机的不相同的数如下:\n");
for(i = 0; i< 100;i++)
if(i%10==0)putchar('\n');
printf("%5d",nums[i]);

putchar('\n');

return 0;
/*运行结果如下:
从0到8192中产生的100个随机的不相同的数如下:

4206 7853 1327 4541 398 754 5374 5259 258 4411
2069 4161 5186 5419 1746 1531 1957 7334 157 1693
5140 6087 1879 6489 2659 1210 102 2302 1522 7118
603 1711 1322 4489 6386 2732 3418 2203 4000 1309
4269 4382 2389 7617 5899 5054 818 4337 1247 5513
7369 2756 2956 7529 6623 6744 5229 4684 7251 2584
5868 3451 1570 4214 1106 1487 4682 5848 4730 3291
6084 7570 602 2128 2447 1741 714 7384 5965 2182
439 5286 2605 6820 6221 6646 1348 3899 3016 4971
2381 2410 1126 1984 1633 2395 5670 1890 5346 2713

**/

//:main
参考技术A 随机取数 关键用到2个函数srand和rand
srand(time(NULL))是让你取到的数每次不一样因为用到了time函数,时间每秒都是不一样的
rand()就是去随机数啦
你可以把N个数存到1个数组里,然后随机100个下标志就OK了
参考技术B #include<stdlib.h>
#include<time.h>
#include<stdio.h>

void main()

int i,k,range,n,a[100];
int min,max,flag=0;
long t;
double j;

min=50;
max=500;
range=max-min;
srand((unsigned)time(&t)); /* 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;*/

do for(i=0;i<100;i++)

n=rand(); /*调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
根据需要多次调用rand(),从而不间断地得到新的随机数;*/

j=((double)n/(double)RAND_MAX); /*把随机数除以RAND_MAX,从而产生一个在0到1之间的校正值;*/

n=(int)(j*(double)range); /*把校正值乘以所需要的范围值(即500-50)从而产生一个在0到43之间的值*/
n+=min; /*把该值和所要求的最小值相加,从而使该值最终落在正确的取值范围----1到44之间。*/
a[i]=n;


for(i=0;i<99;i++) /* 判断这100个数是否重复,如果是,再生成一次,直到各不相同为止,也可以不要这段,呵呵*/
for(k=i+1;k<100;k++)
if(a[i]==a[k]) flag=1;flag=0;

while(flag);
printf("The random number is:\n"); /*产生100个50—500个随机数,并且排成10行10列*/
for(i=0;i<100;i++)
printf("%d ",a[i]);
if((i+1)%10==0) printf("\n");

看看这个,转别人的!

从M个数中随机等可能的取出N个的问题

从0到m-1这m个数中随机取出n个(n<=m) 要求每个数被取到的可能性相等。 
第一个方法是把这m个数丢到一个List里面 然后用nextInt(list.size())来产生随机数 然后把list里面对应的元素丢到另一个数组或者list里面 这个方法本来是不错的 但要注意的是 为了保证每个元素取到的概率相等 需要每取出一个元素 就把它从list里面删除 原因就不解释了 简单的概率问题。但众所周知的是 list的remove(int index)方法 效率并不高 尤其是当m和n很大的时候 每一次调用remove ArrayList都需要进行数组的copy 而LinkedList需要进行链表的遍历。 
所以再考虑这个问题,用数组来储存这m个数是很好的 而且其实我们并不需要知道到底哪些下标的元素被选中了 第一个方法的效率低下的原因在于 nextInt(int i)这个方法是从0 到i-1随机生成整数 这里要求0到i-1是连续的i个整数 而我们选取了一个数之后 为了满足连续整数的条件 就要把这个数删去 而频繁删除的效率是低下的 所以换一种思路 不采用删除 而采用交换 

第二个方法 比如0-99这100个数字 从小到大放在一个数组里面 现在要选10个 我们只需要随机打乱这个数组 然后选取前10个元素就好 随机打乱的方法就是 从数组头元素开始 每次产生一个随机数n 然后交换这两个数 而且只需要交换十次就够了 因为我们并不取下标超过10后面的数字 

 

import java.util.Random;  
  
  
  
public class Rand {  
  
    public static void randSelect(int[] nums, int n) {  
        Random rand = new Random();  
        for(int i = 0; i < n; i ++){  
            swap(nums , i, rand.nextInt(nums.length-i)+i);  
        }  
    }  
      
    public static void swap(int[] nums, int m , int n){  
        int temp = nums[n];  
        nums[n] = nums[m];  
        nums[m] = temp;  
    }  
  
    public static void main(String[] args) {  
        int[] nums = new int[100];  
        for(int i = 0;i < 100;i++){  
            nums[i]=i;  
        }  
        randSelect(nums,10);  
        for(int i = 0;i < 10; i ++){  
            System.out.println(nums[i]);  
        }  
    }  
}  
  
/*output :&nbsp; 
27 
79 
30 
58 
41 
54 
75 
18 
26 
5 
*/  

 

以上是关于C语言程序:从N个数中随机取出100个不同的数的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何从数组中获取一个随机数

如何从已经规定的数组中随机取出一个元素?

如何从已经规定的数组中随机取出一个元素?

求高手,c语言题目,随机输入一个数,范围100到1000.判断它是不是是6和19的倍数。最好for语

c语言 与7无关的数 急

怎么从m个数中随机选择n个数