CCRANDOM_0_1()其实不那么好用 爱上C++随机数的缘由

//rand()实际并不是一个真正的伪随机数发生器,random()会相对好点,但也不算理想。幸运的是iPhone上还有其他的选择。
    //arc4random() 是个不错的选择,原因就是它是一个真正的伪随机算法,而且范围是rand()的两倍。
    /*
    在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值则是 0x100000000 (4294967296),从而有更好的精度。此外,使用arc4random()还不需要生成随机种子,因为第一次调用的时候就会自动生成。
    */
    //通过arc4random() 获取0到x-1之间的整数的代码如下:
    //int value = arc4random() % x;
    //获取1到x之间的整数的代码如下:
    //int value arc4random() % x + 1;
    //最后如果想生成一个浮点数,可以在项目中定义如下宏:
    //#define ARC4RANDOM_MAX      0x100000000
    //然后就可以使用arc4random() 来获取0到100之间浮点数了(精度是rand()的两倍),代码如下:
    //double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
    
    //cocos2d-x里面是这样定义随机数的
    //#define CCRANDOM_0_1() ((float)rand()/RAND_MAX)
    //#define	RAND_MAX	0x7fffffff(标准库定义的额)
    
    
    log("ar4:%u",arc4random());//u_int32_t arc4random(void);
    /*
    函数一:int rand(void);
    返回一个[0,RAND_MAX]间的随机整数。
    函数二:void srand(unsigned seed);
    参数seed是rand()的种子,用来初始化rand()的起始值。
    */
    //可以用以下两种方式产生随机种子
    srand((unsigned)time(0));
    srand((unsigned)time(NULL));
    rand();
    random();
    //time_t time(0):time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。
    log("Long : %ld", time(0));


最近发现C++11提供了新的随机数机制,感觉非常给力。

需要引入头文件

#include <random>

/*
    新设施利用两部分来生成随机数:
    
    random number engines . 负责生成原始随机数
    random number distributions . 迫使生成的随机数在统计上满足指定的概率分布
     
    STL预先指定了一系列的生成引擎,并且提供一个 default_random_engine 。
    default_random_engine 会使用某个预定义的引擎,且不同编译器,不同平台的实现可能不同。
    */
    std::default_random_engine e;
    printf("the e() is %u", e());//产生随机数
    
    /*
     默认情况下,引擎产生的随机数范围在 
     default_randm_engine::min 和 default_random_engine::max 之间。
     */
    printf("min:%u\n",std::default_random_engine::min());//1
    printf("max:%u\n",std::default_random_engine::max());//2147483646
    /*
     有了引擎,我们可以指定随机数要符合的分布性质,例如说,在([5,20])上的均匀分布
     */
    std::uniform_int_distribution<> u(5,20);
    for (size_t i = 0; i < 10; i++) {
        std::cout << u(e) << std::endl;
    }
    
    /*
     上面那两个函数生成的随机数,在我测试的时候每次都是一样的。不知道原因,但是感觉巨坑。可能从头到尾都只给了一次种子吧。强烈推荐最后这种生成方法。
     C++11提供了一个非常友好的类: random_device 。
     这个类的作用是,可以产生 non-deterministic random numbers .
     
     这个类有可能产生真正的随机数,不过真是效果和具体实现有关。
     某些平台可能才用伪随机数作为底层实现也说不定呢…
     显然的,我们可以利用 random_device 去初始化我们的随机数种子
     
     */
    std::random_device rd;
    std::default_random_engine e_real(rd());
    std::uniform_int_distribution<> u_real(5,20);
    for (size_t i = 0; i < 10; i++) {
        std::cout << u_real(e_real) << std::endl;
    }






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cocos2d-x中,我们可以使用CCRANDOM_0_1函数来生成随机数。这个函数会返回一个范围在0到1之间的随机浮点数,可以通过乘以一个范围的大小来得到我们想要的随机数。而为了确保生成的随机数是真正的随机数,我们需要给CCRANDOM_0_1函数传入一个随机数种子。通常情况下,我们会使用时间作为随机数种子,以确保每次运行程序时生成的随机数是不同的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Cocos2d-x中获取系统时间和随机数实例](https://download.csdn.net/download/weixin_38677190/13788211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [在cocos2dx 3.0中如何产生随机数](https://blog.csdn.net/xiaoyu21520/article/details/46152643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [cocos2d-x - 产生随机数(c++)](https://blog.csdn.net/iteye_1287/article/details/82566562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值