乱数の生成


C言語ではrand()関数を用いて乱数を生成することができるが,これは真の意味での乱数ではなく,擬似乱数であり,1つの数に基づいて種子と呼ぶことができ,ある繰返し式を基準に推定した係数であり,この系列数が大きい場合,正規公表に合致し,乱数を生成することに相当する.しかし、これは本当の乱数ではありません.コンピュータが正常に起動した後、このシードの値はシステムを破壊しない限り、このシードの値を変えるために、Cはsrand()関数を提供し、その原形はvoid srand(int a)です.
C言語のランダム関数randomであるが、random関数はANSI C規格ではないので、random関数はgcc、vcなどのコンパイラの下でコンパイルすることはできない.
rand()は、0~RAND_の範囲のランダムな数値を返します.MAX間.RAND_へ0を返します.MAX間の乱数、RAND_MAXはstdlibで定義.h、(その値は少なくとも32767)私が演算した結果は不定の数で、あなたが定義した変数タイプを見ると、int整形は32767です.この関数を呼び出して乱数を生成する前に、srand()を使用して乱数シードを設定する必要があります.乱数シードが設定されていない場合、rand()は呼び出し時に自動的に乱数シードを1に設定します.一般にfor文でシードの個数を設定する.
srand(unsigned int)(time(NULL))を利用することは、プログラムを実行するたびに時間が異なるため、方法です.
Javでjava.util.Randomクラスでは、乱数を生成する方法がいくつか用意されています.
 

 
  
  
  
  
  1.  1import java.util.Random;  
  2.  2public class RandomNumber {  
  3.  3:     public static void main(String[] args) {  
  4.  4:         Random r = new Random();  
  5.  5:         System.out.println(" nextInt()
    "
     + r.nextInt());  
  6.  6:         System.out.println(" nextGaussian(): 0.0 1.0
    "
     
  7.  7:                 + r.nextGaussian());  
  8.  8:         System.out.println(" nextDouble()0.0~1.0
    "
     + r.nextDouble());  
  9.  9:         System.out.println(" nextBoolean(),true   false 
    "
     
  10. 10:                 + r.nextBoolean());  
  11. 11:     }  
  12. 12: } 

C言語で提供される乱数発生器の使い方:現在のCコンパイラはANSI標準に基づく擬似乱数発生器関数を提供し、乱数を生成しています.これらはrand()とsrand()関数です.この2つの関数の作業手順は次のとおりです.
1)まずsrand()に0~65535の値範囲をとるunsigned intタイプの種子を提供する.
2)次にrand()を呼び出し、srand()に与えられたシード値に基づいて乱数(0から32767の間)を返します.
3)必要に応じてrand()を複数回呼び出し、新しい乱数を間欠的に得る.
4)いつでもsrand()に新しいシードを提供し,rand()の出力結果をさらに「ランダム化」することができる.以下は0~32767の間の乱数プログラムです.
 

 
  
  
  
  
  1.  1: #include <stdlib.h>  
  2.  2: #include <stdio.h>  
  3.  3: #include <time.h>           //  
  4.  4: void main( void )  
  5.  5: {int i;  
  6.  6: srand( (unsigned)time( NULL ) );   //  
  7.  7:      for( i = 0; i < 10;i++ )  
  8.  8:     {    // 10  
  9.  9:           printf( " %d
    "
    , rand() );  
  10. 10:     }  
  11. 11: }  
  12. 12: // 0~1 :  
  13. 13: #include <stdlib.h>  
  14. 14: #include <stdio.h>  
  15. 15: #include <time.h>   
  16. 16: main( )  
  17. 17: {int i;  
  18. 18: srand( (unsigned)time( NULL ) );    
  19. 19:        for( i = 0; i < 10;i++ )  
  20. 20:             printf( "%5.2f
    "
    , rand()/32767.0);  
  21. 21: } 

0~100の間の乱数を生成します.
 

 
  
  
  
  
  1. 1// 1~100 :  
  2.  2: #include <stdlib.h>  
  3.  3: #include <stdio.h>  
  4.  4: #include <time.h>   
  5.  5: main( )  
  6.  6: {int i;  
  7.  7: srand( (unsigned)time( NULL ) );    
  8.  8:        for( i = 0; i < 10;i++ )  
  9.  9:             printf( "%d
    "
    , rand()%100+1);  
  10. 10: } 

3つの一般的な乱数発生器:
 

 
  
  
  
  
  1.  1/*  
  2.  2:  : rand   
  3.  3:     :     
  4.  4:     : void rand(void);   
  5.  5: */ 
  6.  6// :   
  7.  7: #include <stdlib.h>   
  8.  8: #include <stdio.h>   
  9.  9:   
  10. 10int main(void)   
  11. 11: {   
  12. 12:    int i;   
  13. 13:   
  14. 14:    printf("Ten random numbers from 0 to 99

    "
    );   
  15. 15:    for(i=0; i<10; i++)   
  16. 16:       printf("%d
    "
    , rand() % 100);   
  17. 17:    return 0;   
  18. 18: }   
  19. 19:   
  20. 20/*  
  21. 21:  : random   
  22. 22:     :     
  23. 23:     : int random(int num);   
  24. 24: */ 
  25. 25// :   
  26. 26:   
  27. 27: #include <stdlib.h>   
  28. 28: #include <stdio.h>   
  29. 29: #include <time.h>   
  30. 30:   
  31. 31/* prints a random number in the range 0 to 99 */   
  32. 32int main(void)   
  33. 33: {   
  34. 34:    randomize();   
  35. 35:    printf("Random number in the 0-99 range: %d
    "
    , random (100));   
  36. 36:    return 0;   
  37. 37: }   
  38. 38:     
  39. 39:     
  40. 40/*  
  41. 41:  : randomize      !  
  42. 42:     :     
  43. 43:     : void randomize(void);   
  44. 44: */ 
  45. 45// :   
  46. 46:   
  47. 47: #include <stdlib.h>   
  48. 48: #include <stdio.h>   
  49. 49: #include <time.h>   
  50. 50:   
  51. 51int main(void)   
  52. 52: {   
  53. 53:    int i;   
  54. 54:   
  55. 55:    randomize();   
  56. 56:    printf("Ten random numbers from 0 to 99

    "
    );   
  57. 57:    for(i=0; i<10; i++)   
  58. 58:        printf("%d
    "
    , rand() % 100);   
  59. 59:    return 0;   
  60. 60: }  

randによる乱数は0からrand_までmax,rand_maxは大きな数で、まずXからYまで、Y-X+1個の数があることがわかりますので、XからYまでの数を生成するには、k=rand()%(Y-X+1)+Xと書くだけです.
 

 
  
  
  
  
  1. 1//  
  2.   2: #include <stdlib.h>   
  3.   3: #include <stdio.h>   
  4.   4: #include<stdio.h>  
  5.   5: #include <time.h>    
  6.   6: swap(int *pm,int *pn)      /* */ 
  7.   7: {  
  8.   8:   //  
  9.   9:    int temp;  
  10.  10:    temp=*pm;  
  11.  11:    *pm=*pn;  
  12.  12:    *pn=temp;  
  13.  13: }  
  14.  14:   
  15.  15int main(void)  
  16.  16: {  
  17.  17:     int   i,a[513];  
  18.  18:     /*int *pa,*pb;*/ 
  19.  19:     srand( (unsigned)time( NULL ) ); /* */ 
  20.  20:     for(i=1; i<=512; i++)  
  21.  21:     {  
  22.  22:         a[i]=i;  
  23.  23:         printf("%4d",a[i]);  
  24.  24:     }  
  25.  25:     for(i=512;   i>=1;   i--)  
  26.  26:     {  
  27.  27:      /* pa=&a[i]; pb=&a[rand()%i+1];*/ 
  28.  28:          swap(&a[i], &a[rand()%i+1]);     /* i , 0*/ 
  29.  29:       /* , */ 
  30.  30:     }  
  31.  31:     printf("
    "
    )  ;  
  32.  32:     for(i=1;   i<=64;   i++)  
  33.  33:     {  
  34.  34:            printf("%4d",a[i] );  
  35.  35:     }  
  36.  36:     getch();   /*wintc */ 
  37.  37: }  
  38.  38:   
  39.  39//  
  40.  40: #include <stdlib.h>   
  41.  41: #include <stdio.h>   
  42.  42: #include<stdio.h>  
  43.  43int main(void)  
  44.  44: {  
  45.  45:    int a[100]={0};  int i,m;  
  46.  46:    for(i=1;   i<=99;   ++i)  
  47.  47:    {  
  48.  48:       printf("%4d",a[i] );  
  49.  49:    }  
  50.  50:    srand( (unsigned)time( NULL ) );  
  51.  51:    for(i=1; i<=99; i++)  
  52.  52:    {  
  53.  53:         while(a[m=rand()%100+1]);  
  54.  54:         a[m] = i;  
  55.  55:    }  
  56.  56:    for(i=1;   i<=99;   ++i)  
  57.  57:    {  
  58.  58:        printf("%4d",a[i] );  
  59.  59:    }  
  60.  60:    getch();  
  61.  61: } 

コンピュータにとって、本当の意味での乱数を生成することは不可能です.プログラムの実行はすでに特定のプログラムの流れを持っていて、私たちは数学の上のいくつかのアルゴリズムを通じてしかできなくて、数字のランダムな分布はコンピュータでシミュレーションしてランダムな数を生成します.この過程で時間は唯一の繰り返し不可能な要素としてランダム数を生産する主な力となっている.
計算機で生成される乱数は本質的に擬似乱数としか言いようがない.
本文は“野馬紅塵”のブログから出て、転載をお断りします!