random.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * @Author: jiejie
  3. * @Github: https://github.com/jiejieTop
  4. * @Date: 2020-01-09 19:25:05
  5. * @LastEditTime: 2020-06-16 14:50:33
  6. * @Description: the code belongs to jiejie, please keep the author information and source code according to the license.
  7. */
  8. #include <stdlib.h>
  9. #include "random.h"
  10. #include "platform_timer.h"
  11. #include "platform_memory.h"
  12. static unsigned int last_seed = 1;
  13. static int do_random(unsigned int seed)
  14. {
  15. srand(seed);
  16. return rand();
  17. }
  18. int random_number(void)
  19. {
  20. unsigned int seed = (unsigned int) platform_timer_now();
  21. last_seed += (seed >> ((seed ^ last_seed) % 3));
  22. return do_random(last_seed ^ seed);
  23. }
  24. // random number range interval [min, max)
  25. int random_number_range(unsigned int min, unsigned int max)
  26. {
  27. return (random_number() % (max - min)) + min;
  28. }
  29. char *random_string(unsigned int len)
  30. {
  31. unsigned int i, flag, seed, random;
  32. char *str = platform_memory_alloc((size_t)(len + 1));
  33. if (NULL == str)
  34. return NULL;
  35. seed = (unsigned int) random_number();
  36. seed += (unsigned int) ((size_t)str ^ seed);
  37. random = (unsigned int)do_random(seed);
  38. for (i = 0; i < len; i++) {
  39. random = do_random(seed ^ random);
  40. flag = (unsigned int)random % 3;
  41. switch (flag) {
  42. case 0:
  43. str[i] = 'A' + do_random(random ^ (i & flag)) % 26;
  44. break;
  45. case 1:
  46. str[i] = 'a' + do_random(random ^ (i & flag)) % 26;
  47. break;
  48. case 2:
  49. str[i] = '0' + do_random(random ^ (i & flag)) % 10;
  50. break;
  51. default:
  52. str[i] = 'x';
  53. break;
  54. }
  55. random += ((0xb433e5c6 ^ random) << (i & flag));
  56. }
  57. str[len] = '\0';
  58. return str;
  59. }