Усі програми з інших відповідей генеруватимуть лише так звані «псевдовипадкові числа», які можуть виглядати випадковими для нетренованого ока, але насправді слідують деякій схемі.
Наступна програма генерує фактичні випадкові числа, перетворюючи комп'ютер у детектор частинок для фонового випромінювання. Оскільки це ґрунтується на квантових ефектах, це насправді випадково і неможливо передбачити. А для бонусу програма насправді працює швидше, якщо запустити комп’ютер у космос. І так, це все круто, як це звучить.
С
#include<stdio.h>
int main(void)
{
int i,j,k,l,m;
printf("How many random numbers do you want?");
scanf ("%i",&m);
for (i=0; i<m; i++)
{
j = k = 42;
l = 0;
while (j==k)
l++;
printf("%i\n", l);
}
}
Спойлер:
Ця програма генерує два однакових пам'яті, а потім чекає, скільки часу потрібно, щоб фонове випромінювання змінило один з них. Потім час очікування повертається у вигляді випадкового числа, яке було б експоненціально розподілене, якби не цілі переповнення. Такі події, які є більш імовірними в космосі, є актуальною проблемою космонавтики, яку вирішують радіаційним зміцненням . Отже, кожне твердження у вступі до певної міри вірно, окрім частини про прохолоду.
На жаль, така подія, що вибиває комп'ютер чи принаймні програму, скоріше, ніж впливає саме на ці дві частини пам'яті. Крім того , це може зайняти деякий час ... І, нарешті, як зазначив kinokijuf, радіаційний фон зовнішній процес, так j
і k
повинно бути позначено як volatile
для компілятора (або ви повинні використовувати компілятор , яка не оптимізує взагалі).
PS:
Розширюючи ідею, можна також просто створити масив, заповнений нулями, а потім роздрукувати його. Є ймовірність ε, що фонове випромінювання змінює нулі між зберіганням та друком, і, таким чином, те, що друкується, є випадковим - ОП ніколи не говорило про те, як розподіляти випадкові числа.