本帖最后由 test01 于 2012-11-3 01:46 编辑
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #include <stdlib.h>
- void generating_random_seed (uint_fast16_t seed_width, uint16_t seed_bits[]) //Occupied A7 pin. Arduino with the statement.
- {
- const uint_fast16_t MAX_WIDTH = 256;
- const uint_fast8_t NOISE_INPIT_PIN = A7;
-
- if ((seed_width <= 0) and (seed_width > MAX_WIDTH))
- {
- return;
- }
- analogReference(INTERNAL); //Arduino with the statement
- uint_fast8_t analog_bit_n0, analog_bit_n1;
- uint16_t analog_bits;
- int_fast8_t n = 0;
- analog_bit_n0 = read_bit(analogRead(NOISE_INPIT_PIN), 16, 0); //Arduino with the statement
- while (n < 16)
- {
- analog_bit_n1 = read_bit(analogRead(NOISE_INPIT_PIN), 16, 0); //Arduino with the statement
- if (analog_bit_n0 not_eq analog_bit_n1)
- {
- analog_bits = xor_bit(analog_bits, 16, n, (analog_bit_n0 > analog_bit_n1) ? 0 : 1);
- analog_bit_n0 = read_bit(analogRead(NOISE_INPIT_PIN), 16, 0); //Arduino with the statement
- ++n;
- }
- else
- {
- analog_bit_n0 = analog_bit_n1;
- }
- }
- srand(analog_bits);
-
- const uint16_t WORD_10 = (((uint16_t)B10101010) << 8) | B10101010;
- const uint16_t WORD_01 = compl WORD_10;
- const uint16_t WORD_11 = compl((uint16_t)0);
- div_t array_length = div(seed_width - 1, 16);
- uint16_t initialization_bits;
- ((rand() % 2) == 0) ? initialization_bits = WORD_10 : initialization_bits = WORD_01;
- for (int_fast8_t i = 0; i <= array_length.quot; ++i)
- {
- seed_bits[i] = initialization_bits;
- }
- seed_bits[array_length.quot] and_eq compl(WORD_11 << (array_length.rem + 1));
-
- analog_bit_n0 = read_bit(analogRead(NOISE_INPIT_PIN), 16, 0); //Arduino with the statement
- for (int_fast16_t i = (int_fast16_t)seed_width * 3 - 1; i >= 0; --i)
- {
- ldiv_t seed_pointer = ldiv((int_fast32_t)seed_width * rand() / ((uint_fast16_t)RAND_MAX + 1), 16);
- analog_bit_n1 = read_bit(analogRead(NOISE_INPIT_PIN), 16, 0); //Arduino with the statement
- if (analog_bit_n0 not_eq analog_bit_n1)
- {
- seed_bits[seed_pointer.quot] = xor_bit(seed_bits[seed_pointer.quot], 16, seed_pointer.rem, (analog_bit_n0 > analog_bit_n1) ? 0 : 1);
- analog_bit_n0 = read_bit(analogRead(NOISE_INPIT_PIN), 16, 0); //Arduino with the statement
- }
- else
- {
- analog_bit_n0 = analog_bit_n1;
- }
- }
- }
复制代码
===========================
说明:这用了A7模拟输入脚,让A7接一根悬空的长引线效果好
可生成1位到256位的真随机数
注意,受avr里的adc所限,产生的随机数如果要用在质量要求高的应用,一定先行检验是否符合要求
欢迎大家来检验这个发生器的随机性 |