问:如何判断当前是否已设定种子数

Really_want 2016-06-23 05:43:17
问题简介:
。。通常情况下,使用rand()函数前要用srand(seed)设置随机种子数,但一个程序只需要设置一次种子数就够了,不必每次使用rand()都去设置。所以,在局部,如何能判断当前程序是否已经设置过随机种子数呢?

问题背景:
。。我在别人的库的基础上开发,据库描述,已经设置种子数。即是说我的代码中不需要设置(种子数)。
。。现在忽略关于设置种子数的描述,假如库中没有设置种子数,我需要设置以便我使用rand()时能合理的产生随机数;或者,库中设置过了,我就不需要设置了。如果再次设置,那就影响了原来的随机分布了。
。。所以,我的代码中是否需要设置种子数,取决于在执行我的代码前是否已设置了种子数。
。。为了使代码更合理,我希望无论库中是否设置过随机数(依赖别人的库,什么事情都可能发生:)),我都能产生合理的随机数。并且每次程序启动产生的顺序不同,即种子数不能是默认值。


...全文
216 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2016-06-26
  • 打赏
  • 举报
回复
你重新再初始化一次并不会影响什么
Really_want 2016-06-25
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
[quote=引用 11 楼 ccssddnn218 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 啥叫“合理的”随机数?
谢谢“赵4老师”关注。我认为的“合理”随机数,就是程序启动到结束只设置一次种子数,以后获取随机数时都是根据这个初始种子数来的,中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。[/quote] 试试Inline Hook msvcrt.dll 中的srand函数,在其中判断如果当前进程调用srand当且仅当一次且参数不是0 不是VC6 Release版exe的话,msvcr*.dll[/quote] 您隐含的意思是这样吗?放弃在标准C的srand上继续纠结了,有其他库可以完成想要的结果。
Really_want 2016-06-25
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/
谢谢!很不错的工具,要好好学习一下。
赵4老师 2016-06-25
  • 打赏
  • 举报
回复
我这句话的意思很直白,没有隐含意思。
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
仅供参考:
#include <conio.h>
void main() {
    int r,k;
    cprintf("Press any key to get a real random number(0..99) ...");
    r=0;
    while (1) {
        r=(r+1)%100;
        if (kbhit()) {
            k=getch();
            if (0==k || 0xe0==k) getch();
            break;
        }
    }
    cprintf("\r\n%d\r\n",r);
}
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
啥叫“合理的”随机数?
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
引用 11 楼 ccssddnn218 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 啥叫“合理的”随机数?
谢谢“赵4老师”关注。我认为的“合理”随机数,就是程序启动到结束只设置一次种子数,以后获取随机数时都是根据这个初始种子数来的,中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。[/quote] 试试Inline Hook msvcrt.dll 中的srand函数,在其中判断如果当前进程调用srand当且仅当一次且参数不是0 不是VC6 Release版exe的话,msvcr*.dll
qq13020110 2016-06-24
  • 打赏
  • 举报
回复
static bool check = true; if(check) { rand(); //你的取随机数代码 check = false; } 再你的函数内部,加入这样一段代码,即可保证rand只执行一次
Really_want 2016-06-24
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
啥叫“合理的”随机数?
谢谢“赵4老师”关注。我认为的“合理”随机数,就是程序启动到结束只设置一次种子数,以后获取随机数时都是根据这个初始种子数来的,中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。
fefe82 2016-06-24
  • 打赏
  • 举报
回复
可以在 main 的第一句设置一次。 以后也不用判断。
lm_whales 2016-06-24
  • 打赏
  • 举报
回复
如果仅仅是随机数的话,可以自定义随机数发生器 C++可以定义随机数发生器类 C就定义一个结构和 跟结构关联的算法就可以了 这样随机数就成为为 对象而不是 库函数了 随机数发生器对象和其他随机数发生器对象互不干扰 C++11库中就有这种随机数发生器类
bravery36 2016-06-23
  • 打赏
  • 举报
回复
随机数算法的随机就在于别人不知道种子和调用次数,只要两者做到隐藏其中一个,算法就是随机的。
bravery36 2016-06-23
  • 打赏
  • 举报
回复
随机和均匀是两回事。对外部来讲,就算你重置了种子,结果还是随机的。(种子通常是时间,比较难准确定位)
Really_want 2016-06-23
  • 打赏
  • 举报
回复
引用 3 楼 qq423399099 的回复:
好像没啥特别的方法。 不过有个取巧的办法,调用rand()时,如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。 所以,如果楼主不想破坏原本的种子,那么自己提前手动在文件中先保存种子为1时,rand() % 100产生的10个随机数 然后运行程序后:直接调用rand() % 100产生10个随机数,看看和之前文件中保存的10个数一样吗,如果一样就有理由相信之前的代码没有srand过
方法可行、合理,略显复杂。依然谢谢你!
小灸舞 版主 2016-06-23
  • 打赏
  • 举报
回复
好像没啥特别的方法。
不过有个取巧的办法,调用rand()时,如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。
所以,如果楼主不想破坏原本的种子,那么自己提前手动在文件中先保存种子为1时,rand() % 100产生的10个随机数
然后运行程序后:直接调用rand() % 100产生10个随机数,看看和之前文件中保存的10个数一样吗,如果一样就有理由相信之前的代码没有srand过
dustpg 2016-06-23
  • 打赏
  • 举报
回复
标准C肯定不行,不过特定的实现可以.实际换个随机数发生器,c++11这么多.... 不过比较在意"如果再次设置,那就影响了原来的随机分布了"这句,一般就是用时间做为种子,不管怎样都会影响....
「已注销」 2016-06-23
  • 打赏
  • 举报
回复
无解。(6个字凑数)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧