Números randômicos

Publicado por Davi das Chagas Neves 21/11/2008

[ Hits: 11.259 ]

Homepage: www.google.com

Download randon.cpp




Fiz um programinha para gerar números aleatórios em c++ e resolvi compartilha-lo aqui no Viva o Linux. Quem tiver alguma dúvida sobre a linguagem C++ sugiro a leitura da apostila: www.del.urfj.br/~villas/livro_c++.html

A minha idéia aqui é apenas fornecer o código para que outras pessoas possam usá-lo, inclusive na elaboração de outros programas mais complexos, como na utilização do método de monte carlo.

Observando-o, vale ressaltar que, para gerar números inteiros, basta substituir as linhas:

x=(delta*fabs(sin(rand()))+xmin);
y=(delta*fabs(sin(rand()))+xmin);

por:

x=(rand()%(delta+1)+xmin);
y=(rand()%(delta+1)+xmin);

e declarar as devidas variáveis como inteiras. Para diferenciar o range dos valores de y, basta acrescentar as variáveis ymax, ymin e deltay, colocando-as nas devidas linhas.

Por fim, para compilar este programa, salve-o como random.cpp e use:

$g++ -w -o random random.cpp
$./random

Espero que seja útil para alguém.

  



Esconder código-fonte

//Gerando numeros reais aleatórios num intervalo [max,min] específico.
//Programa para gerar números (pares xy) aleatórios -> gcc & g++
#include<iostream> /*Biblioteca padrão para entrada e saida de dados no console*/
#include<cmath> /*Biblioteca padrão para utilização de funções matematicas(fabs() e sin())*/
#include<ctime>  /*Biblioteca de contagem temporal utilizada para gerar a semente do processo*/
#include <cstdlib> /*Biblioteca padrão para utilização das funções (srand() e rand()) utilizadas na geração de número aleatórios*/
using namespace std;
int main()
{
//Declaração das variáveis
   int c,N,seed;
   float x,y,xmin,xmax,delta;
//Semente baseada no tempo de processamento da CPU.
   seed=time(0);
   srand((unsigned)seed);
//Definição dos parâmetros:
   cout << "\t Digite o limite inferior do intervalo\n";
   cin >> xmin;
   cout << "\t Digite o limite superior do intervalo\n";
   cin >> xmax;
   cout << "\t Qual a quantidade de números que devem ser gerados?\n";
   cin >> N;
   delta=xmax-xmin;
//Firula
   cout << "\v\t ##### Gerando " << N <<" pares aleatórios #####\v" << endl;
   cout << "\t\t > No intervalo [ " << xmin << " , " << xmax << " ]\n" << endl;
//Gerando os pares:
   for (c=1;c<=N;c++)
   {
      x=(delta*fabs(sin(rand()))+xmin);
      y=(delta*fabs(sin(rand()))+xmin);
      cout << x << "\t" << y << endl;
   }
}

Scripts recomendados

Salario bruto e liquido de um funcionario

C --> Calculadora de equações de 2º grau explicada.

Decremento e incremento

Crivo de Eratóstenes

Contador de palavras, linhas e caracteres de um arquivo texto


  

Comentários
[1] Comentário enviado por rubiamp em 03/02/2013 - 23:23h

Era o que eu precisava! Me ajudou muito.
Obrigada :)

[2] Comentário enviado por LucasCampos em 04/02/2013 - 00:47h

Cara, muito esquisita sua escolha de usar abs(sin(rand())). Como o período de abs(sin) é pi, essa parte da função pode ser somente sin(0)=0, sin(1)=0.84, sin(2)=0.9, sin(3)=0.14, o que dá um número aleatório em apenas quatro possíveis possibilidades. Para formar números aleatórios entre dois valores, é melhor usar

double RandEntreDbl(double xmin, double xmax) {
const double delta = xmax-xmin;
return (rand()/(double)RAND_MAX)*delta+xmin;
}

e

int RandEntreInt(int xmin, int xmax) {
const int delta = xmax-xmin;
return (rand()%delta)+xmin;
}

Teremos assim toda uma quantidade de possibilidades tão grande quanto RAND_MAX.

Como nota final, atualmente com o C++11 é possivel criar distribuições com máximos e mínimos especificados em sua criação, utilizando std::uniform_int_distribution ou std::uniform_real_distribution. Mais informações em http://en.wikipedia.org/wiki/C++0x#Extensible_random_number_facility


Contribuir com comentário