数学建模社区-数学中国
标题:
请大家帮忙看看这样取随机数可以吗
[打印本页]
作者:
world_xin
时间:
2009-6-8 11:25
标题:
请大家帮忙看看这样取随机数可以吗
因为要同时抽取好多组的随机数,但又不希望用同一个种子文件
7 A2 S+ d ~- I
因此程序如下,请大家帮忙看看这样做有没有问题,多谢
3 ~8 P# D0 U( L; e2 |; I' w
& x" r3 \* F0 Y' w7 O: ^, v* Z
for (i=0;i<bin;i++)
% s% r+ S' \- n7 F D
{
3 w- }8 o& j6 E2 I, T+ U. G
srand((int)time(0)+1000*i);
9 m' L& J1 M$ q& k+ c( j0 w
for (j=0;j<nn;j++)
( g- {3 \( ?, B- s1 g5 U
{
( q4 z% u5 h8 f ~$ i+ F
x = (long double)rand()/RAND_MAX;
% m0 |( A# Q9 P( v2 j$ J7 _; o
y = (long double)rand()/RAND_MAX*1.574212218771126;
; x$ D/ Y5 T& _! Q; I
if(y<profile(x))
1 V7 f" h! T/ l( G5 T7 P
fprintf(f,"%20.15Lf\n",(x+i)*period);
9 m! Z, M7 x$ N. e0 T
}
1 R! z: b$ ]% n; F6 f+ o
}
作者:
madio
时间:
2009-9-3 23:35
random和 rando多可以产生随机数,包含在stdlib.h里。
0 q( {; D5 w8 d/ v5 b
random函数不是ANSI C标准,不能在gcc,vc等编译器下编译通过。但在C语言中int random(num)可以这样使用,它返回的是0至num-1的一个随机数。 可改用C++下的rand函数来实现。
* ]: m* J" F) Y8 @' |
1、C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
. u' \# m. @/ h- ?' U
2、C++中另一函数srand(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。
) k- y9 T2 r, B3 Z5 ~$ z6 ?
3、 比较理想的是用变化的数,比如时间来作为随机数生成器的种子。 time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
9 [' ~- l1 Y( Z, H5 X
rand运用问题与解答:
1 v6 P Q1 V1 E! S# l
问:为什么有时rand()用它都是同一个数?如何产生一个真正随机数?
' [" H; o0 W8 b; F+ h2 q5 F" }4 ?# s
答:之所以rand()每次的随机数都一样是因为rand()函数使用不正确。各种编程语言返回的随机数(确切地说是伪随机数)实际上都是根据递推公式计算的一组数值,当序列足够长,这组数值近似满足均匀分布。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。这个特性被有的软件利用于加密和解密。加密时,可以用某个种子数生成一个伪随机序列并对数据进行处理;解密时,再利用种子数生成一个伪随机序列并对加密数据进行还原。这样,对于不知道种子数的人要想解密就需要多费些事了。当然,这种完全相同的序列对于你来说是非常糟糕的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。你可以在调用rand()函数之前调用srand( (unsigned)time( NULL ) ),这样以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。你也可以使用srand函数来人为指定种子数。Windows 9x/NT的游戏FreeCell就允许用户指定种子数,这样用户如果一次游戏没有成功,下次还可以以同样的发牌结果再玩一次。
9 D2 D" f( P1 A$ Z' a8 o. E
例子:
, \0 P! o' ^# `' q4 o4 G, Z" M
以下为引用的内容:
; r* h. W9 u$ K) l4 m
#include <stdlib.h>
6 r. r; O1 g, R5 z% u) h
#include <iostream.h>
) p# J; a. I: r: w4 j: N' T
#include <conio.h>
% T6 t+ k* O5 m. ?% Z
#include <time.h>
# \- N! j- y0 q8 w4 z
void main()
, S$ N6 K1 H( z( s: @
{
4 x; G( e+ J$ {. V: b- {
srand( (unsigned)time( NULL ) ); //注意不要放在for循环里,否则产生的数是同一个数。
2 Q, e0 m# B8 M/ Z1 _
for(int i=0;i<100000;i++)
/ C0 C" ?: g/ h
{
6 k! `$ p- C2 ^! F5 a
cout<<rand()<<endl;
/ s, I2 O0 J% R6 b( h
}
2 c$ e# ?; @5 }: T* `" \3 O3 o
}
作者:
李——建辉
时间:
2012-1-25 20:45
嘿嘿,声明一下:本人看贴和回贴的规则,好贴必看,精华贴必回。
5610401069448530913717568348171722629215433605991616398430261146779477050245392
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5