¿De qué manera es más rápido generar dos números aleatorios 1 y -1 en la programación?

De acuerdo, en primer lugar, en su ejemplo, la declaración if es la menor de sus preocupaciones.

Para la computadora, si las declaraciones son a la velocidad del rayo. Generación de números aleatorios, sin embargo, no lo es.

Si está trabajando en C ++, una forma de hacerlo sería usar std :: rand () o algún otro generador de números aleatorios.

std :: rand () (para el cual necesita #incluir ) le dará un número entero aleatorio entre 0 y RAND_MAX (un número muy grande).

Si desea obtener un número aleatorio entre cero y cualquier número entero dado, puede hacer std :: rand ()% n, que le dará cualquier número hasta n, no incluido.

Entonces este es un comienzo. std :: rand ()% 2 te dará 0 o 1. ¡Pero necesitas -1 o 1!

Para solucionar esto, podemos tomar el resultado, multiplicarlo por dos y restar uno. De esta manera, 0 se convertirá en 0 * 2-1 = -1 y 1 se convertirá en 1 * 2-1 = 1

En resumen, una forma de hacerlo sería x = (std :: rand ()% 2) * 2-1;

Sin embargo, esta no es una respuesta muy satisfactoria. Quiero decir, funciona, pero podría ser mejor. Probemos algo mas

Si queremos obtener 0 o 2 (para poder restar 1 para obtener los números que desea), simplemente podemos hacer un simple truco binario.

Si observamos la representación binaria de un número aleatorio, es algo así como 00101110 (muchos bits no incluidos)

Si tomamos * solo * el segundo bit de la derecha, obtendremos 00000010 o 00000000. ¡Esto es dos o cero! Entonces, solo podemos restar uno.

Esto puede sonar complicado y todo, pero todo lo que necesita hacer es usar el operador AND bit a bit y obtener:

x = std :: rand () & 2 – 1;

¡Y hecho!

Como nota al margen, recomendaría buscar la documentación de std :: rand, ya que tiene algunas peculiaridades. Por ejemplo, para que sus números no sean predecibles, deberá inicializar una semilla usando std :: srand ()

Además de la respuesta de Sergey Zubkov, intente almacenar el drand48 en un entero de 64 bits y cambie el 1 y el 0. Esto será mucho más eficiente.
Tenga en cuenta que la canalización funciona mejor sin un condicional.
bool x = (randnum >> i) & 1;
int bernoulli = 1- 2 * x; // sin predicción de rama

Su ejemplo es costoso porque descarta 47 de 48 bits de aleatoriedad que POSIX drand48 genera en cada iteración. Como menciona C ++, tiene una función específicamente diseñada para dar dos números aleatorios: std :: bernoulli_distribution – cppreference.com

Hay varias funciones con diferentes métodos que pueden ayudarlo a generar un número aleatorio entre 0 y 1.
Una función verdaderamente aleatoria, lleva un poco de tiempo y no será la más rápida.
Puedes escribir una función aleatoria tú mismo. p.ej:
Si realmente solo necesita que el programa elija entre -1 y 1, obtenga la marca de tiempo. Comprueba si es impar o par. Asigne uno de ellos a -1 y el otro a 1.
Esto no sería realmente aleatorio, pero elegirá uno.

Si desea la respuesta real a su pregunta, debe esperar hasta que alguien que haya abierto la mayoría de las funciones aleatorias lo ayude.