简介
伪随机数生成算法基于梅森旋转算法,可生成boolean、int、double类型的随机数。
数据结构
伪随机数GRand的数据结构是不透明结构体,只能作为整体使用,无法单独引用其内部成员。
typedef struct _GRand GRand;
函数列表
GRand * g_rand_new_with_seed ()
GRand * g_rand_new_with_seed_array ()
GRand * g_rand_new ()
GRand * g_rand_copy ()
void g_rand_free ()
void g_rand_set_seed ()
void g_rand_set_seed_array ()
#define g_rand_boolean()
guint32 g_rand_int ()
gint32 g_rand_int_range ()
gdouble g_rand_double ()
gdouble g_rand_double_range ()
void g_random_set_seed ()
#define g_random_boolean
guint32 g_random_int ()
gint32 g_random_int_range ()
gdouble g_random_double ()
gdouble g_random_double_range ()
函数功能分类
随机数生成函数包括rand类函数和random类函数两大类,两者区别是:
- rand 需要自行设置种子,连续多次调用伪随机数,生成结果不同。连续执行多次程序,每次结果均相同。
- random 非常方便,但种子是随机的。
rand类
创建GRand对象
GRand * g_rand_new_with_seed ()
GRand * g_rand_new_with_seed_array ()
GRand * g_rand_new ()
复制
GRand * g_rand_copy ()
释放
void g_rand_free ()
设置种子
void g_rand_set_seed ()
void g_rand_set_seed_array ()
生成随机数或在指定区间生成随机数
#define g_rand_boolean()
guint32 g_rand_int ()
gint32 g_rand_int_range ()
gdouble g_rand_double ()
gdouble g_rand_double_range ()
random类
设置种子
void g_random_set_seed ()
生成随机数或在指定区间生成随机数
#define g_random_boolean
guint32 g_random_int ()
gint32 g_random_int_range ()
gdouble g_random_double ()
gdouble g_random_double_range ()
函数功能说明及综合演示
生成伪随机数(rand)
示例代码如下:
源码见glib_examples\glib_random\glib_random_rand
#include <glib.h>
gint main(gint argc, gchar **argv)
{
GRand *rand;
const guint32 seed_array[] =
{
0xbeefbeef,
0xfeedfeed,
0xfeedbeef,
0xbeeffeed
};
rand = g_rand_new_with_seed(65535);
g_print("seed-65535: %d \n", g_rand_int(rand));
g_print("seed-65535: %d \n", g_rand_int(rand));
g_print("seed-65535: %d \n", g_rand_int_range(rand, 100, 200));
g_print("seed-65535: %d \n", g_rand_int_range(rand, 100, 200));
g_rand_set_seed(rand, 888);
g_print("seed-888: %d \n", g_rand_int(rand));
g_print("seed-888: %d \n", g_rand_int_range(rand, 100, 200));
g_rand_set_seed_array(rand, seed_array, G_N_ELEMENTS (seed_array));
g_print("seed-array: %d \n", g_rand_int(rand));
g_print("seed-array: %d \n", g_rand_int_range(rand, 100, 200));
g_rand_free(rand);
return 0;
}
运行结果:
[root@centos7_6 build]# ./glib_random_rand
seed-65535: 830396586
seed-65535: -194277707
seed-65535: 105
seed-65535: 143
seed-888: -603182594
seed-888: 130
seed-array: 1767929153
seed-array: 131
[root@centos7_6 build]# ./glib_random_rand
seed-65535: 830396586
seed-65535: -194277707
seed-65535: 105
seed-65535: 143
seed-888: -603182594
seed-888: 130
seed-array: 1767929153
seed-array: 131
可以看到,多次运行程序,结果都是一模一样的,这是因为生成伪随机数的种子是一样的。
生成伪随机数(random)
示例代码如下:
源码见glib_examples\glib_random\glib_random_random
#include <glib.h>
gint main(gint argc, gchar **argv)
{
g_print("g_random_int: %d %d %d %d \n", g_random_int(), g_random_int(), g_random_int(), g_random_int());
g_print("g_random_int_range: %d %d %d %d \n", g_random_int_range(1, 100), g_random_int_range(101,200),
g_random_int_range(201,203), g_random_int_range(301,500));
return 0;
}
运行结果:
[root@centos7_6 build]# ./glib_random_random
g_random_int: 1507109472 -1117921203 -337966659 -343983802
g_random_int_range: 32 187 201 485