| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2112 人关注过本帖
标题:新人求问,这组代码是用来产生随机数的吗?求大神解释
只看楼主 加入收藏
王盛阳
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-5-16
结帖率:0
收藏
已结贴  问题点数:20 回复次数:5 
新人求问,这组代码是用来产生随机数的吗?求大神解释
#define MBIG 1000000000
#define MSEED 161803398
#define MZ 0
#define FAC 1.0E-9
double    CMCMie::RandomGen(char Type, long Seed, long *Status)
{
    static long i1, i2, ma[56];   /* ma[0] is not used. */
    long        mj, mk;
    short       i, ii;

    if (Type == 0) {              /* set seed. */
        mj = MSEED - (Seed < 0 ? -Seed : Seed);
        mj %= MBIG;
        ma[55] = mj;
        mk = 1;
        for (i = 1; i <= 54; i++)
        {
            ii = (21 * i) % 55;
            ma[ii] = mk;
            mk = mj - mk;
            if (mk < MZ)
                mk += MBIG;
            mj = ma[ii];
        }
        for (ii = 1; ii <= 4; ii++)
            for (i = 1; i <= 55; i++) {
                ma[i] -= ma[1 + (i + 30) % 55];
                if (ma[i] < MZ)
                    ma[i] += MBIG;
            }
            i1 = 0;
            i2 = 31;
    } else if (Type == 1) {       /* get a number. */
        if (++i1 == 56)
            i1 = 1;
        if (++i2 == 56)
            i2 = 1;
        mj = ma[i1] - ma[i2];
        if (mj < MZ)
            mj += MBIG;
        ma[i1] = mj;
        return (mj * FAC);
    } else if (Type == 2) {       /* get status. */
        for (i = 0; i < 55; i++)
            Status[i] = ma[i + 1];
        Status[55] = i1;
        Status[56] = i2;
    } else if (Type == 3) {       /* restore status. */
        for (i = 0; i < 55; i++)
            ma[i + 1] = Status[i];
        i1 = Status[55];
        i2 = Status[56];
    } else
        AfxMessageBox(_T("Wrong parameter to RandomGen()."));
    return (0);
搜索更多相关主题的帖子: define Type Status for i++ 
2017-05-16 12:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:7 
看上去应该是随机数的计算公式~是模拟产生随机数~~~~通过Seed的参数来决定随机数序列~~~因为该序列其周期性较长~所以看上去像是随机数了~~实质Seed的值不变该序列就不会变~严格来说是"伪随机数"~当然这还是带有很强的随机性质的~~~

感觉常用的rand函数算法应该是类似这东东~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-16 13:20
丧钟
Rank: 2
来 自:哥谭市
等 级:论坛游民
帖 子:10
专家分:10
注 册:2017-5-9
收藏
得分:7 
回复 2楼 九转星河
请问一下,你能适当的解释一下这个程序不?运行起来有好几个错的,表示完全看不懂!!!谢谢!!!

今天的菜鸟,明天的高手!!!
2017-05-16 14:09
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
可以简单转化为c 代码  如何调用却是不会
程序代码:
#include <stdio.h>

#define MBIG 1000000000
#define MSEED 161803398
#define MZ 0
#define FAC 1.0E-9

double  RandomGen(char Type, long Seed, long *Status)
{
    static long i1, i2, ma[56];   /* ma[0] is not used. */
    long        mj, mk;
    short       i, ii;

    if (Type == 0) {              /* set seed. */
        mj = MSEED - (Seed < 0 ? -Seed : Seed);
        mj %= MBIG;
        ma[55] = mj;
        mk = 1;
        for (i = 1; i <= 54; i++)
        {
            ii = (21 * i) % 55;
            ma[ii] = mk;
            mk = mj - mk;
            if (mk < MZ)
                mk += MBIG;
            mj = ma[ii];
        }
        for (ii = 1; ii <= 4; ii++)
            for (i = 1; i <= 55; i++) {
                ma[i] -= ma[1 + (i + 30) % 55];
                if (ma[i] < MZ)
                    ma[i] += MBIG;
            }
            i1 = 0;
            i2 = 31;
    } else if (Type == 1) {       /* get a number. */
        if (++i1 == 56)
            i1 = 1;
        if (++i2 == 56)
            i2 = 1;
        mj = ma[i1] - ma[i2];
        if (mj < MZ)
            mj += MBIG;
        ma[i1] = mj;
        return (mj * FAC);
    } else if (Type == 2) {       /* get status. */
        for (i = 0; i < 55; i++)
            Status[i] = ma[i + 1];
        Status[55] = i1;
        Status[56] = i2;
    } else if (Type == 3) {       /* restore status. */
        for (i = 0; i < 55; i++)
            ma[i + 1] = Status[i];
        i1 = Status[55];
        i2 = Status[56];
    } else
        printf("Wrong parameter to RandomGen().");
}
int main()
{
    return 0;
}


 

DO IT YOURSELF !
2017-05-16 15:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 丧钟
  } else if (Type == 1) {       /* get a number. */
        if (++i1 == 56)
            i1 = 1;
        if (++i2 == 56)
            i2 = 1;
        mj = ma[i1] - ma[i2];
        if (mj < MZ)
            mj += MBIG;
        ma[i1] = mj;
        return (mj * FAC);

这里i1 i2好像没有赋予初值~~~这个程序本身没有问题么?~~~

如果可以的话要找个完整的实测程序来看看效果才行~~光说很多东西说不清~~~

[此贴子已经被作者于2017-5-16 17:29编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-16 17:26
丧钟
Rank: 2
来 自:哥谭市
等 级:论坛游民
帖 子:10
专家分:10
注 册:2017-5-9
收藏
得分:0 
回复 5楼 九转星河
好吧!!!

今天的菜鸟,明天的高手!!!
2017-05-16 22:27
快速回复:新人求问,这组代码是用来产生随机数的吗?求大神解释
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016297 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved