作者foxkid (只有冰与雪)
看板NCKU_CSIE93
标题Re: [请益]
时间Sun Oct 5 19:37:44 2008
※ 引述《chys49 (丿嘎)》之铭言:
: ※ 引述《boypower (321)》之铭言:
: Questions:
: Step1:
: Create a routine GetData() to generate a float-point number between
: 0 and 1 randomly. Since rand() only generate integers from 0 to 32767(i.e.
: 2^15),to improve the randomness,we use the following scheme:
: a□□...□15bits and b□□...□15bits = 30bits (arrays)
: The first 15 bits and the latter 15 bits are generated through different
: seeds. Then,through a process called normalization,which is to divide the
: resulting sequence by 2^30.( Don't use time() )
1.这里看来 题目的意思是产生一个30bits 二进位的数字
然後再除以2^30,结果就是一个介於0於1之间的floating
2.但是呢,题目有限定这个30bits数字产生的规则
前十五个bits与後十五个bits必须使用不同的seeds(请准备两个seeds)
A.按照1跟2,首先使用两个seeds,造出前十五个bits跟後十五个bits。
其实很简单,就使用两个seeds造两个数,其大小介於0~(2^15-1)
有了这两个数,就代表你的30bits的数字已经出来搂。
所以就顺手把这两个数字转成二进位吧!,此时我们已经有了30个0与1
B.解着要除以2^30,但是当然不能呆呆的就给他除下去啦!
以3个bits为例子
(111=1*2^2+1*2^1+1*2^0=4+2+1=7) normalize by 2^3
观察normalization有甚麽特殊的意义?
1*(2^2/2^3)+1*(2^1/2^3)+1*(2^0/2^3)
=(1/2^1)+(1/2^2)+(1/2^3)
也就是说呢,normalize之後每个bits的意义改变为(1/(2^(30-n))) n=0~29
这里是这题最tricky的地方,懂了才能解这题。
明白了题目normalization的意义之後,就把之前获得的30个0与1,换成新的意义。
以3个bits为例子:
101 mormalize by 2^3 = 1*(1/2^1)+0*(1/2^2)+1*(1/2^3)
= 1/2 + 1/8
把3个bits延伸到30个bits就可以得到一个介於0~1之间的floating
: Step2:
: Use the routine GetData() to generate 1000 float-point number data and store
: them in a 1-dimensional array named Data{} (maximum capacity 1000).
这题没意义,呼叫第一题的function一千次,把结果存在一维阵列里面。
: Please~~
虽然没给code,但是已经把关键的地方点出来了。
试着实作看看吧。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.166.116.56
1F:推 chys49:谢谢^^谢谢^^ 我试试看~~ 10/05 21:14
2F:推 chys49:我卡在seeds,用time()不够均匀,但又想不到其它的,自己另外 10/06 00:35
3F:→ chys49:写一个则不太成功。 10/06 00:38
4F:→ boypower:time()当seed应该满均匀的 要不要贴code看看 10/07 01:53
5F:→ foxkid:其实rand()也只是去查乱数表 seed是告诉他从那边开始查 10/07 13:30
6F:→ foxkid:像boypower所说 time()已经满均匀了 不然可以换clock? XD 10/07 13:31
7F:→ chys49:若用time()有时乱数会重复,而且每次执行时会有某些区间很 10/08 11:43
8F:→ chys49:集中,除非让时间够长,所以努力K原文书中~~不知道方向对不对 10/08 11:47