Comece agoraComece grátis

Geração de números aleatórios escalares

Quando você escreve código em R, geralmente faz sentido gerar números aleatórios de forma vetorizada. Porém, em C++, você pode (até com a consciência tranquila) usar laços e processar os dados elemento por elemento.

A API do R oferece funções para gerar um número aleatório a partir de uma das distribuições usuais, e o Rcpp torna essas funções acessíveis no namespace R::. Por exemplo, R::rnorm(2, 3) retorna um número aleatório da distribuição Normal com média 2 e desvio padrão 3. Observe que o argumento n da rnorm() "de verdade" não está presente. A versão do Rcpp sempre retorna um único número.

Vá em frente e complete a definição da função positive_rnorm().

Observação: Este último capítulo é difícil, então não desanime se você não conseguir concluir os exercícios na primeira tentativa. Lembre-se da recompensa por concluir este curso: melhorar drasticamente o desempenho do seu código em R!

Este exercicio faz parte do curso

Otimizando código R com Rcpp

Ver curso

Instruções do exercicio

  • Especifique o valor de retorno, out, como um vetor numérico de tamanho n.
  • Leia o código de repetição para ver o que cada um faz.
  • Gere um número aleatório Normal com média mean e desvio padrão sd, atribuindo a out[i].
  • Enquanto out[i] for menor ou igual a zero, tente novamente.

exercicio interativo prático

Tente este exercicio completando este código de exemplo.

#include 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector positive_rnorm(int n, double mean, double sd) {
  // Specify out as a numeric vector of size n
  ___ ___(___);
  
  // This loops over the elements of out
  for(int i = 0; i < n; i++) {
    // This loop keeps trying to generate a value
    do {
      // Call R's rnorm()
      out[i] = ___;
      // While the number is negative, keep trying
    } while(___);
  }
  return out;
}

/*** R
  positive_rnorm(10, 2, 2)
*/
Editar e Executar Código