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