STM 32 F 103ソフトウェア構成乱数Rand()


STM 32 F 103ソフトウェア構成乱数Rand()
個人の総括:“知能の速達の箱”を完成する時乱数の配置を使って1つの取り出しコードを生んで、使用するマスターはSTM 32 F 103 C 8 T 6で、ハードウェアの乱数がないので、自分でソフトウェアを通じて配置する必要があります.
問題の鍵:rand関数は乱数を生成する前に、システムが提供する擬似乱数シーケンスを生成するシードが必要であり、randはこのシードの値に基づいて一連の乱数を生成する.システムが提供するシードが変化しない場合、rand関数を呼び出すたびに生成される擬似乱数シーケンスは同じです.srand(unsigned seed)は、パラメータseedによってシステムが提供するシード値を変更し、rand関数を呼び出すたびに生成される擬似乱数シーケンスを異なり、真の意味での「ランダム」を実現することができる.通常、システム時間を利用するシステムのシード値、すなわちsrand(NULL)を変更することができ、rand関数に異なるシード値を提供することができ、さらに異なる乱数シーケンスを生成することができる.KeilではC言語のようにネイティブの時間を取得できないため、時間変数を他の動的変数に変換するしかありません.
次は私が構成中に使用した考え方です.
1、C言語での使用構成
まずC言語で乱数の構成機能を実現し、そのコードは以下の通りである.
#include
#include
#include
#include

//=======================               ===================// 
//
//    rand() :        
//
//    Time(0):         
//
//    srand(time(0)):        :rand()      ,           , 
//                                , 1970.1.1     ,        。
int main()
{
     
    int a;
    int i;
    char arry[10]; 
    char arry1[10] = {
     "\0"}; 
    
    srand(time(0));    //            
    
    for(i=0;i<4;i++)
    {
     
    	a = rand()%9;   //      
    	printf("%d\r
"
,a); sprintf(arry,"%d",a); strcat(arry1,arry); // } printf("%s\r
"
,arry1); return 0; }

2、Keil上の使用構成
KeilではCのライブラリ関数を呼び出すことにしたが,time(0)という取得時間の機能がなくなり,time(0)を別の動調値に置き換えた.動的な変化量を得るためには,少なくとも2つの方法が考えられる.
Keil上の使用構成:その1つは、システムのタイマを通じて、時間パラメータを生成し、これは動的である.二つ目は、ADを測定することによって、電圧値も変化する値である.
ここでは方法1、タイマーで乱数を構成するしかありません.コードは次のとおりです.
·random.c
//===================================               ===============================// 
//
//    rand() :        
//
//    srand(seed):   seed         ,                      
//
//    seed          us       ,    ADC      (         )
//
//===============================================================================================//
#include "random.h"
#include "stdlib.h"     //==        
#include "string.h"     //==       
#include "usart.h"
#include "key.h"

extern u32 time_us;     //            
u8 seed[10] = {
     "\0"};   //     ,       

//---------------------------------------------------
//
//        :         
//      :  n:     
//       :  
//  
//---------------------------------------------------
void rand_seed(u8 n)
{
     
    int a,i;
    char arry[5];
    char arry1[5] = {
     "\0"};
	

		if(first)     //     
		{
     
			first = 0;
			srand(time_us);   //       
		}
		
		for(i=0;i<n;i++)
		{
     
			a = rand()%9;     //     
			
			printf("%d\r
"
,a); sprintf(arry,"%d",a); strcat((char *)arry1,arry); // } }

シリアルポートで印刷すると、srand(time_us)を使用しないことがわかります.あるいはtime_usが定数に設定されている場合、rand()で印刷された値は変化せず、逆に可能であることがわかります.ここではシリアルポートのスクリーンショットは表示されません.