c_cpp C中的小型随机字符串生成器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp C中的小型随机字符串生成器相关的知识,希望对你有一定的参考价值。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

typedef struct
{
  uint64_t state;
  uint64_t inc;
} pcg32_random_t;

uint32_t
pcg32_random_r(pcg32_random_t* rng)
{
  uint64_t oldstate = rng->state;
  // Advance internal state
  rng->state = oldstate * 6364136223846793005ULL + (rng->inc | 1);
  // Calculate output function (XSH RR), uses old state for max ILP
  uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u;
  uint32_t rot = oldstate >> 59u;
  return (xorshifted >> rot) | (xorshifted << ((-rot) & 31));
}

char*
make_string(pcg32_random_t* rng, char* buf, size_t len)
{
  char n = 0;
  n = pcg32_random_r(rng);
  for (size_t i = 0; i < len - 1; i++) {
    n = 0;
  again:
    n = pcg32_random_r(rng);
    if ((n < 'A' || n > 'Z') && (n < 'a' || n > 'z') && (n < '0' || n > '9'))
      goto again;
    buf[i] = (char)n;
  }
  buf[len - 1] = 0;
  return buf;
}

int
main(void)
{
  char string[32] = { 0 };

  // Do a little magic to seed the generator initially
  pcg32_random_t r = { 0 };
  r.inc = (time(NULL) << 1u) | 1u;
  pcg32_random_r(&r);
  r.state = (uintptr_t)&r << 8;

  for (size_t i = 0; i < 10; i++)
    printf("%s\n", make_string(&r, string, sizeof(string)));

  exit(0);
}

以上是关于c_cpp C中的小型随机字符串生成器的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp xoroshiro128 +伪随机数生成器的C ++包装器

c_cpp 使用细胞自动机生成随机数

c_cpp 伪随机生成的假数据用于测试内部工具

c_cpp 带有putc打印的小型trie框架

c_cpp 给出链表,使得每个节点包含一个附加的随机指针,该指针可以指向列表中的任何节点或为空。返回

c_cpp 用于嵌入式程序的小型RingQueue(例如Arduino,AVR,mbed等。