3_10_GLib库入门与实践_伪随机数生成器

简介

伪随机数生成算法基于梅森旋转算法,可生成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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值