Сделать так, чтобы не вызывать постоянно функцию random с различным числом k - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, решить проблему. Есть функция, дающая случайные числа:
#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);
 
}
Случайнве числа, полученные таким образом нужно использовать в следующем коде (здесь это y_massiv[j+e]):
    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;
}

Объяснение кода листинга программы

  1. В данном коде используется генератор псевдослучайных чисел, который основывается на алгоритме 64-битный геш-функция.
  2. Для хранения состояния функции после каждого ее вызова используются статические переменные: Curr, Z31, Z21.
  3. Каждый следующий сгенерированный номер Z[i] вычисляется как разность Z[i-31] и Z[i-21].
  4. Переменная Curr хранит текущий индекс i, Z31 - индекс i-31, Z21 - индекс i-21.
  5. Чтобы не расширять массив, его элементы используются циклически.
  6. В функции main() массив Z инициализируется числами от 0 до 30.
  7. Затем в цикле генерируются и выводятся на экран 10000 случайных чисел.
  8. В конце программы вызывается функция system(pause), которая ожидает нажатия клавиши для продолжения работы программы.
  9. Функция main() возвращает 0, что означает успешное выполнение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы