C的亂數產生器

本文介绍了一组C++函数,用于生成随机整数及浮点数。通过这些函数可以初始化随机种子、生成指定范围内的随机数等。文章提供了完整的实现代码。
cpp 代码
  1. // file: sj03.h   
  2.   
  3. void rnd1(int *s1);   
  4. void rnd2(int *s1, double *x);   
  5. void swap_int(int *x, int *y);   
  6. void irnd(int *s1, int i1, int i2, int *ii);   
  7. void init_rnd(int *s1);   
  8. // ----------------------------------------------   
  9.   
  10. void rnd1(int *s1)   
  11. {   
  12.     // r(n)= (r(n-1)*a + b) MOD c   
  13.     // a= 7^5= 16807.0   
  14.     // b= 0.0   
  15.     // c= 2147483647.0   
  16.     // ----------------------------------------------   
  17.   
  18.     // double r1, r2, r3;   
  19.     // r1= (double) (*s1);   
  20.     // r2= r1*16807.0;   
  21.     // r3= fmod(r2, 2147483647.0);   
  22.   
  23.     (*s1)= (int) ((fmod((((double) (*s1))*16807.0), 2147483647.0)) + 0.5);   
  24. }// end rnd1()   
  25. // ----------------------------------------------   
  26.   
  27. void rnd2(int *s1, double *x)   
  28. {   
  29.     rnd1(s1);   
  30.     *x= ((double) *s1)/2147483647.0;   
  31. }// end rnd2()   
  32. // ----------------------------------------------   
  33.   
  34. void swap_int(int *x, int *y)   
  35. {   
  36.     int z;   
  37.   
  38.     z= *x;   
  39.     *x= *y;   
  40.     *y= z;   
  41. }// end swap_int()   
  42. // ----------------------------------------------   
  43.   
  44. void irnd(int *s1, int i1, int i2, int *ii)   
  45. {   
  46.     double x;   
  47.     rnd2(s1, &x);   
  48.   
  49.     // I hope i1 <= i2   
  50.     if (i1 > i2) {   
  51.         swap_int(&i1, &i2);   
  52.     }   
  53.   
  54.     *ii= ((int) (x*(i2 - i1 + 1))) + i1;   
  55. }// end irnd()   
  56. // ----------------------------------------------   
  57.   
  58. void init_rnd(int *s1)   
  59. {   
  60.     int t1, t2;   
  61.     time1(&t1);   
  62.     // ----------------------------------------------   
  63.   
  64.     t2= t1;   
  65.     do {   
  66.         time1(&t1);   
  67.     } while (t1 == t2);   
  68.     // t1 <> t2   
  69.     // ----------------------------------------------   
  70.   
  71.     *s1= t1;   
  72.     for (int i=0;i<300;i++) {   
  73.         rnd1(s1);   
  74.     }   
  75. }// end init_rnd()   

自己寫的。

 

<think>好的,用户想要解决输入捕获时数字不稳定的问题。我需要先分析可能的原因,再给出解决方案。 首先,输入数字波动可能由硬件噪声或信号抖动引起。比如按钮或传感器接触不良,或者电磁干扰。这时候可能需要加入硬件滤波,比如RC低通滤波器,或者在软件中采用消抖处理,比如延时检测或者多次采样取平均。 其次,软件算法方面,用户可能在代码中没有对输入信号进行稳定化处理。例如,直接读取瞬间值而没有去抖逻辑。这时候可以考虑软件消抖,比如在检测到信号变化后等待一段时间再确认状态,或者在连续多次采样中判断一致性。 另外,可能涉及到ADC(模数转换器)采样的噪声。这时候可以增加采样次数,使用滑动窗口平均或中值滤波来平滑数据。例如,连续采样10次,去掉最大最小值后取平均,或者使用移动平均算法。 还有可能是电源不稳定导致信号波动,需要检查电源滤波和接地是否良好。如果问题出现在数字信号捕获,比如GPIO输入,可能需要配置内部上拉或下拉电阻,确保信号在无输入时有确定的电平。 软件方面,可以采用状态机来跟踪输入变化,只有在一定时间内状态稳定才认为有效。例如,检测到高电平后,等待20ms再次检测,如果仍然高电平才确认。这可以避免毛刺干扰。 此外,数字信号可能因为机械开关的弹跳导致多次触发,这时候软件消抖尤为重要。常见的做法是在检测到变化后,延时10-50ms再重新检测状态。 如果涉及到高速信号捕获,可能需要使用硬件定时器的输入捕获功能,结合中断处理,并设置合适的滤波参数,比如设置边沿检测的滤波时间。 总结下来,解决方案包括硬件滤波、软件消抖算法、多次采样取平均、使用中值滤波、配置合适的上下拉电阻,以及优化电源稳定性等。需要根据具体应用场景选择合适的方法,或者结合多种方法提高稳定性。</think>### 输入数字不稳定的原因及解决方案 #### 1. 硬件噪声干扰 - **原因**:传感器、按钮或电路中的电磁干扰会导致信号抖动。例如,机械开关的触点弹跳会产生多次电平跳变[^2]。 - **解决方案**: - 加入RC低通滤波器(硬件消抖),例如: $$ R = 10k\Omega, \quad C = 0.1\mu F $$ - 使用施密特触发器整形信号。 - 优化电源设计,增加去耦电容。 #### 2. 软件消抖处理 - **原因**:直接读取瞬时值会捕获到瞬态波动。 - **解决方案**: - **延时检测法**:检测到信号变化后延时10-50ms再确认。 - **多次采样法**:连续采样$N$次(如$N=5$),仅当连续$M$次(如$M=3$)结果一致时才认为有效。 ```c // 示例:Arduino按钮消抖 int stableRead(int pin) { int val = digitalRead(pin); delay(10); if (val == digitalRead(pin)) return val; return -1; // 表示未稳定 } ``` #### 3. 信号平滑算法 - **原因**:模拟信号(如ADC采样)存在随机噪声。 - **解决方案**: - **移动平均滤波**: $$ y_n = \frac{1}{N} \sum_{k=0}^{N-1} x_{n-k} $$ - **中值滤波**:取最近$N$个采样值的中间值。 ```python # Python示例:滑动窗口平均 def smooth_data(data, window_size=5): return [sum(data[i:i+window_size])/window_size for i in range(len(data)-window_size+1)] ``` #### 4. 输入捕获配置优化 - **原因**:未配置硬件滤波或触发条件。 - **解决方案**(以STM32为例): ```c // 配置定时器输入捕获滤波器(抑制高频噪声) TIM_ICInitTypeDef ic; ic.TIM_ICPolarity = TIM_ICPolarity_Rising; ic.TIM_ICFilter = 0x0F; // 最大滤波系数 TIM_ICInit(TIM3, &ic); ``` #### 5. 状态机设计 - **原因**:未对输入状态进行稳定性跟踪。 - **解决方案**: ```c // 状态机示例(检测稳定高电平) enum {IDLE, DETECTED, CONFIRMED} state = IDLE; void check_stable_input() { switch(state) { case IDLE: if (digitalRead(PIN) == HIGH) { state = DETECTED; start_timer(20); // 开始20ms计时 } break; case DETECTED: if (timer_expired() && digitalRead(PIN) == HIGH) { state = CONFIRMED; trigger_action(); // 触发稳定动作 } break; } } ``` ### 典型应用场景 - 工业控制系统中,通过卡尔曼滤波器融合多传感器数据以提高稳定性[^1]。 - 组合逻辑电路设计中,通过冗余逻辑门降低噪声影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值