回 帖 发 新 帖 刷新版面

主题:程序当中产生一个四位0至9互不相同的数存入数组

我是刚学C语言编程的,现在有一个问题,想请大家解决一下。
我写了几行代码,不过测试并不理想,不知道是什么原因。
程序思想:
1:先构造一个数组,按顺序存入0至9。
   用随机函数产生一个0至9的下标。
   再取出数组中的数放入另一个数组并删除数组中的数,重新排序。
   第二次时,随机函数产生0至8的下标。
   这样每次都不会产生相同的数了。
#include "stdio.h"
#include "stdlib.h"
main()
{  int a[]={0,1,2,3,4,5,6,7,8,9};
   int i,x[4],n,b=10;
   for(I=0;i<4;i++)
   {  srand(time(0));
      n=rand()%b;
      x[i]=a[n];/*把取出数赋给新数组x[4]*/
      while(n!=9)/*删除取出数并重新排序数组*/
      {  a[n]=a[n+1];
         n++;
      }
      b--;/*使随机产生的下标小1*/
      printf("%d\n",a[i]);
    }
}
2:先构造一个数组,按顺序存入0到9。
   用随机函数产生一个0到9的下标。
   取出数存入新的数组后,用后面的数覆盖取出来的数。
   第一次用下标9的数覆盖取出来的数,第二次用下标8等以此类推。
#include "stdio.h"
#include "stdlib.h"
main()
{  int a[]={0,1,2,3,4,5,6,7,8,9};
   int i,n,x[4],b=10,c=9;
   for(i=0;i<4;i++)
   {  srand(time(0));
      n=rand()%b;
      x[i]=a[n];/*把取出数放入新的数组*/
      a[n]=a[c];/*用后面的数覆盖取出的数*/
      c--,b--;
      printf("%d\n",a[i]);
   }
}
3:随机产生一个数,再产生第二个数,如果产生相同的数就重新产生,
至到新生出四个互不相同的随机数为止。
代码没写。
测试结果并不理想,数并不随机,第一个数不是0就是1,有些数出现的多,有的不出现。

回复列表 (共5个回复)

沙发

请把srand挪到循环外:)

板凳

[quote]请把srand挪到循环外:)[/quote]



void srand ( unsigned int seed ); <cstdlib> 

Initialize random number generator

The pseudo-random number generator is initialized using the argument passed as seed.

For every different seed value used in a call to srand, the pseudo-random number generator can be expected to generate a different succession of results in the subsequent calls to rand.
Two different initializations with the same seed, instructs the pseudo-random generator to generate the same succession of results for the subsequent calls to rand in both cases.

If seed is set to 1, the generator is reinitialized to its initial value and produces the same values as before any call to rand or srand.

In order to generate random-like numbers, srand is usually initialized to some distinctive value, like those related with the execution time. For example, the value returned by the function time (declared in header <ctime>) is different each second, which is distinctive enough for most randoming needs.



Parameters
seed 
An integer value to be used as seed by the pseudo-random number generator algorithm. 


int rand ( void ); <cstdlib> 

Generate random number

Returns a pseudo-random integral number in the range 0 to RAND_MAX.

This number is generated by an algorithm that returns a sequence of apparently non-related numbers each time it is called. This algorithm uses a seed to generate the series, which should be initialized to some distinctive value using srand.

RAND_MAX is a constant defined in <cstdlib>. Its default value may vary between implementations but it is granted to be at least 32767.

A typical way to generate pseudo-random numbers in a determined range using rand is to use the modulo of the returned value by the range span and add the initial value of the range:

( value % 100 ) is in the range 0 to 99
( value % 100 + 1 ) is in the range 1 to 100
( value % 30 + 1985 ) is in the range 1985 to 2014

Notice though that this modulo operation does not generate a truly uniformly distributed random number in the span (since in most cases lower numbers are slightly more likely), but it is generally a good approximation for short spans.


请看这句:
Two different initializations with the same seed, instructs the pseudo-random generator to generate the same succession of results for the subsequent calls to rand in both cases.

在先前的例子中,由于两次 randNumber(); 函数调用的时间非常接近,导致 seed 的值 (unsigned)time(NULL) 基本上是一样的,所以:generate the same succession of results for the subsequent calls to rand in both cases. 因此两次调用 rand() 产生的值会一样。

而在后面的例子中,srand() 函数只调用一次,所以没有上面的问题


Example
/* rand example: guess the number */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
{
  int iSecret, iGuess;

  /* initialize random seed: */
  srand ( time(NULL) );

  /* generate secret number: */
  iSecret = rand() % 10 + 1;

  do {
    printf ("Guess the number (1 to 10): ");
    scanf ("%d",&iGuess);
    if (iSecret<iGuess) puts ("The secret number is lower");
    else if (iSecret>iGuess) puts ("The secret number is higher");
  } while (iSecret!=iGuess);

  puts ("Congratulations!");
  return 0;
}
 


Output:

Guess the number (1 to 10): 5The secret number is higherGuess the number (1 to 10): 8The secret number is lowerGuess the number (1 to 10): 7Congratulations! 


In this example, the random seed is initialized to a value representing the second in which the program is executed (time is defined in the header <ctime>). This way to initialize the seed is generally a good enough option for most randoming needs.

请看这句:
the random seed is initialized to a value representing the second in which the program is executed (time is defined in the header <ctime>). 
seed 的值取决于程序运行时的时间的秒的值,而你的程序全部运行完都是在秒以内的,所以两次 time 返回的值应该是一样的,你可以打印出来看下

3 楼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
   int a[]={0,1,2,3,4,5,6,7,8,9};
   int Rand1,Rand2,Temp;
   srand((unsigned int)time(NULL));

   for(i=0;i<5;i++){
       Rand1=(rand()/(RAND_MAX/10+1));
       do{
           Rand2=(rand()/(RAND_MAX/10+1));
       }while(Rand1==Rand2);
       Temp=a[Rand1];
       a[Rand1]=a[Rand2];
       a[Rand2]=Temp;
   }
   return 1;
}
代码未调试
主要思想就是随机算10之内的两个数交换一下
多交换几次即可

4 楼

顶楼主 楼主观点不错  
[color=FFFFFF]
[color=#ffffff]http://www.ruiyish.com[/color]  [url=http://www.ruiyish.com][color=#ffffff]万艾可[/color][/url]
[color=#ffffff]http://www.zxgrow.com[/color]  [url=http://www.zxgrow.com][color=#ffffff]卡王[/color][/url]
[color=#ffffff]http://www.gzkemei.com[/color]  [url=http://www.gzkemei.com][color=#ffffff]基因育根[/color][/url]
[color=#ffffff]http://www.dfdzpcb.com[/color]  [url=http://www.dfdzpcb.com][color=#ffffff]阴茎增大[/color][/url]
[color=#ffffff]http://www.jishiyaofang.com[/color]  [url=http://www.jishiyaofang.com][color=#ffffff]超级P57[/color][/url]
[color=#ffffff]http://www.KYKYY.COM[/color]  [url=http://www.jishiyaofang.com][color=#ffffff]充气仿真娃娃[/color][/url]
[color=#ffffff]http://www.jskmvchina.com[/color]  [url=http://www.jskmvchina.com][color=#ffffff]怎么样才能生儿子[/color][/url]
[color=#ffffff]http://www.cdwucheng.com[/color]  [url=http://www.cdwucheng.com][color=#ffffff]脚气的治疗方法[/color][/url] 
[color=#ffffff]http://www.am688.com[/color]  [url=http://www.am688.com][color=#ffffff]阴茎短小[/color][/url]
[color=#ffffff]http://www.jxhaichuan.com[/color]  [url=http://www.jxhaichuan.com][color=#ffffff]快高[/color][/url]
[color=#ffffff]http://www.chxtn.com[/color]  [url=http://www.chxtn.com][color=#ffffff]wifi 密码破解[/color][/url]  [/color]

5 楼

第二个想法 还是比较好的

具有随机性,只是那随机数种子。。。有些问题

我来回复

您尚未登录,请登录后再回复。点此登录或注册