Сделать так, чтобы не вызывать постоянно функцию 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, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д