C_and_CPP 板


LINE

※ 引述《chrisjon (随机数能吃吗?)》之铭言: : ===========程式内容================== : #include <stdio.h> : void lcga(void) : { : static int Lcg_seed = 12345; : int lcg_a,lcg_p; : lcg_p = 2147483647; : lcg_a = 16807; : lcg_seed = (lcg_a*lcg_seed) % lcg_p; ^ ^ 大小写不符合 这样应该无法编译成功 : printf("%d\n", Lcg_seed); : } : int main(void) : { : int i; : for(i=0; i<5;i++) : lcga(); : printf("%d\n", Lcg_seed); 写程式不要这样缩排,很容易以为你的 printf 也是回圈的一部份 一般的良好写法是这样: for(i = 0; i < 5; i++) lcga(); printf("%d\n", Lcg_seed); : return 0; : } [deleted] : 我仿书上把lcg_seed在全区宣告,但是不知道为什麽 : 呼叫lcga,在lcga列印lcg_seed是 0;在main列印lcg_seed是12345不会变 : 所以试着用 static ,结果可以,但是变得无法在main print....(红色那行) 应该是其它地方写错了,请附上完整程式码 : 另外,我的程式中 : lcg_seed = (lcg_a*lcg_seed) % lcg_p; : 照道理来讲,求出来的余数应该永远是正的 : 怎麽会出现负的答案呢...~.~?? : 我用Maple程式去跑答案,只有第一个答案是正确的,之後没有一个正确 : 程式哪里有问题呢?? 因为 int 一般来说大小为 32bit 储存范围是 -2147483648 ~ 2147483647 你的计算已经超过了它的范围,当然会得到错误的结果 C99 的标准有提供 64bit 的整数型别 int64_t 如果你的 compiler 有支援,这是最简单的解决方法 : ======================================== : 另外 : int main(void) : { : unif01_Gen *gen; : gen = ulcg_CreateLcg (2147483647, 397204094, 0, 12345); : retuen 0 : } : 我执行过相同的 ulcg_CreateLcg函数(包含後方的参数) : 它能产生不同的数字 : 我该如何 写出像这样的函数呢? 它可能用了 64bit 整数 或是自己去处理大数运算 : 是否直接用.txt写好,存成.c 就可以用#include "lcga.c"呼叫了呢? : 感恩 不行,这不是正确用法。 正确的方法是把函式的宣告写在 .h 内,函式的实作写在 .c 内, 然後让你的主程式去连结函式的实作 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.217.34.43
1F:推 chrisjon:lcg_seed 原始是写 Lcg_seed,我的全程式就是那样^^" 05/03 15:09
2F:→ chrisjon:喔!!会错意...我去生出程式码,谢谢建议 05/03 15:20
3F:→ chrisjon:我不知道有没有支援...^^" 那要怎麽宣告呢? 05/03 15:33
4F:→ chrisjon:我刚去试着改宣告成double lcg_seed,结果 %无法计算.. 05/03 15:34
5F:→ chrisjon:把lcg_a和lcg_p一起改成double,一样也无法计算%...~.~ 05/03 15:35
6F:→ chrisjon:错误都一样(invalid operand to binary %) 05/03 15:39
7F:→ chrisjon:刚把lcg_seed丢到全域,又可以跑了...怪怪..只是一样溢位 05/03 15:40
8F:→ weiyucsie:我只知道c99有long long 可是有int64_t吗? 05/03 16:14
9F:→ sunneo:%的问题再很久以前的文章提过了 要用fmod 05/03 16:18
10F:→ sunneo:浮点操作跟整数操作有差 05/03 16:19
11F:→ sunneo:如果你这麽坚持要% 那乾脆(*(long long*)&变数1)%(变数2) 05/03 16:20
12F:→ chrisjon:之前原本是以为要产生浮点数,後来发现好像不用 05/03 16:20
13F:→ chrisjon:所以就把浮点数部份的程式删除了,现在只是要整数就行了 05/03 16:21
14F:→ chrisjon:用%是要求余数,不是吗? ^^" 05/03 16:23
15F:→ chrisjon:int64_t 有用,刚刚去试了,执行成功,没有溢位问题^^ 05/03 16:24
16F:→ sunneo:%只有定义整数的余数操作 没有定义在浮点数上 05/03 16:24
17F:→ chrisjon:(至少我刚的16807*lcg_seed mod (2^31-1)跑5次没溢位) 05/03 16:25
18F:→ chrisjon:嗯嗯!!sun大,我已经把浮点数的部份删除了,所以改回用% 05/03 16:26
19F:→ adrianshum:良好的写法是单一行也加 { .. } 05/04 12:00







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP