random.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * @Author : jiejie
  3. * @GitHub : https://github.com/jiejieTop
  4. * @Date : 2021-02-26 12:00:24
  5. * @LastEditors : jiejie
  6. * @LastEditTime : 2022-06-15 19:44:22
  7. * @FilePath : /mqttclient/common/random.c
  8. * Copyright (c) 2022 jiejie, All Rights Reserved. Please keep the author
  9. * information and source code according to the license.
  10. */
  11. #include "random.h"
  12. #include <stdlib.h>
  13. #include "PikaObj.h"
  14. static unsigned int last_seed = 1;
  15. static int do_random(unsigned int seed) {
  16. srand(seed);
  17. return rand();
  18. }
  19. int random_number(void) {
  20. unsigned int seed = (unsigned int)pika_platform_thread_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. return (random_number() % (max - min)) + min;
  27. }
  28. int random_string(char* buffer, int len) {
  29. unsigned int i, flag, seed, random;
  30. if (NULL == buffer)
  31. return 0;
  32. seed = (unsigned int)random_number();
  33. seed += (unsigned int)((size_t)buffer ^ seed);
  34. random = (unsigned int)do_random(seed);
  35. for (i = 0; i < len; i++) {
  36. random = do_random(seed ^ random);
  37. flag = (unsigned int)random % 3;
  38. switch (flag) {
  39. case 0:
  40. buffer[i] = 'A' + do_random(random ^ (i & flag)) % 26;
  41. break;
  42. case 1:
  43. buffer[i] = 'a' + do_random(random ^ (i & flag)) % 26;
  44. break;
  45. case 2:
  46. buffer[i] = '0' + do_random(random ^ (i & flag)) % 10;
  47. break;
  48. default:
  49. buffer[i] = 'x';
  50. break;
  51. }
  52. random += ((0xb433e5c6 ^ random) << (i & flag));
  53. }
  54. buffer[len] = '\0';
  55. return len;
  56. }