Сделать так, чтобы не вызывать постоянно функцию random с различным числом k - C (СИ)
Формулировка задачи:
Помогите, пожалуйста, решить проблему. Есть функция, дающая случайные числа:
Случайнве числа, полученные таким образом нужно использовать в следующем коде (здесь это y_massiv[j+e]):
и этот кусок кода может выполняться не один раз, т.е. значение
#include <stdio.h> #include <stdlib.h> #include <math.h> //k - необходимое количество случайных чисел на выходе //t - инициализирующие значения датчика случайных чисел void random(int k, int *t) { int i, j, sum; int v[1024],w[1024],u[1024],y[1024],z[1024]; for (i=1; i<=31; i++) { z[i]=t[i]; } // 1 шаг for(i=32; i<=k+256; i++) { z[i]=(z[i-31]-z[i-21])%65257; if(z[i]<0) { z[i]=z[i]+65257; } } // 2 шаг for(i=1; i<=k+256; i++) { sum=0; for(j=1; j<=i; j++) { sum=sum+z[j]; } v[i]=sum%65536; } // 3 шаг w[0]=0; for(i=1; i<=k+256; i++) { w[i]=(z[i+20]+(w[i-1]/2)+32768*(w[i-1]%2))%65536; if(w[i]<0) { w[i]=w[i]+65536; } } // 4 шаг for(i=1; i<=k+256; i++) { u[i]=w[i]^v[i]; } // 5 шаг for(i=1; i<=k; i++) { y[i]=(u[i+256]+(u[i+255]/255))%256; if(y[i]<0) { y[i]=y[i]+256; } printf("%d\n", y[i]); } } void main() { int *t; int i, n=31, k=100; t=malloc(n*sizeof(int)); for (i=1; i<=n; i++) { t[i]=i; } random(k, t); }
sum=0; for(j=0; j=k_massiv[t]-1; j++) { y_massiv_summ[j]=y_massiv[j+e]; sum+=y_massiv_summ[j]; } M=sum%d_massiv[t]; e=e+k_massiv[t];
e
будет меняться, следовательно будет меняться индекс y_massiv[j+e]. Вопрос: Как сделать так, чтобы не вызывать постоянно функцию random с различным числомk
? Т.е. если нужно 5 случ. чисел, а потом 7, а потом 48, как сделать так, чтобы считать не заново 7 чисел, а "дописывать", считать только 2 числа? Язык - строго Си. Без ++. Помогите, пожалуйста!Решение задачи: «Сделать так, чтобы не вызывать постоянно функцию random с различным числом k»
textual
Листинг программы
#include <iostream> unsigned int* Z;//массив со значениями для генератора случайных чисел int Rand() { static int Curr=0,Z31=0,Z21=9;//статические переменные для хранения состояния функции после каждого ее вызова //каждое следующее сгенирированное число Z[i]=Z[i-31]-Z[i-21] // Curr это индекс i,Z31- индекс i-31,Z21-индекс i-21 unsigned int result=Z[Curr]=static_cast<unsigned int>(Z[Z31]-Z[Z21])%65257; //чтобы не расширять массив, двигаемся по исходному циклически Curr+=Curr==31?-31:1; Z31+=Z31==31?-31:1; Z21+=Z21==31?-31:1; return result; } int main() { Z=new unsigned int[31]; for(int i=0;i<31;Z[i]=i,i++);//инициализируем массив for(int i=0;i<10000;i++) std::cout<<Rand()<<'\n'; system("pause"); return 0; }
Объяснение кода листинга программы
- В данном коде используется генератор псевдослучайных чисел, который основывается на алгоритме
64-битный геш-функция
. - Для хранения состояния функции после каждого ее вызова используются статические переменные: Curr, Z31, Z21.
- Каждый следующий сгенерированный номер Z[i] вычисляется как разность Z[i-31] и Z[i-21].
- Переменная Curr хранит текущий индекс i, Z31 - индекс i-31, Z21 - индекс i-21.
- Чтобы не расширять массив, его элементы используются циклически.
- В функции main() массив Z инициализируется числами от 0 до 30.
- Затем в цикле генерируются и выводятся на экран 10000 случайных чисел.
- В конце программы вызывается функция system(
pause
), которая ожидает нажатия клавиши для продолжения работы программы. - Функция main() возвращает 0, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д