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言語で乱数の構成機能を実現し、そのコードは以下の通りである.
2、Keil上の使用構成
KeilではCのライブラリ関数を呼び出すことにしたが,time(0)という取得時間の機能がなくなり,time(0)を別の動調値に置き換えた.動的な変化量を得るためには,少なくとも2つの方法が考えられる.
Keil上の使用構成:その1つは、システムのタイマを通じて、時間パラメータを生成し、これは動的である.二つ目は、ADを測定することによって、電圧値も変化する値である.
ここでは方法1、タイマーで乱数を構成するしかありません.コードは次のとおりです.
·random.c
シリアルポートで印刷すると、srand(time_us)を使用しないことがわかります.あるいはtime_usが定数に設定されている場合、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()で印刷された値は変化せず、逆に可能であることがわかります.ここではシリアルポートのスクリーンショットは表示されません.