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

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

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

Помогите, пожалуйста, решить проблему. Есть функция, дающая случайные числа:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. //k - необходимое количество случайных чисел на выходе
  5. //t - инициализирующие значения датчика случайных чисел
  6. void random(int k, int *t)
  7. {
  8. int i, j, sum;
  9. int v[1024],w[1024],u[1024],y[1024],z[1024];
  10.  
  11. for (i=1; i<=31; i++)
  12. {
  13. z[i]=t[i];
  14. }
  15. // 1 шаг
  16. for(i=32; i<=k+256; i++)
  17. {
  18. z[i]=(z[i-31]-z[i-21])%65257;
  19. if(z[i]<0)
  20. {
  21. z[i]=z[i]+65257;
  22. }
  23. }
  24. // 2 шаг
  25. for(i=1; i<=k+256; i++)
  26. {
  27. sum=0;
  28. for(j=1; j<=i; j++)
  29. {
  30. sum=sum+z[j];
  31. }
  32. v[i]=sum%65536;
  33. }
  34. // 3 шаг
  35. w[0]=0;
  36. for(i=1; i<=k+256; i++)
  37. {
  38. w[i]=(z[i+20]+(w[i-1]/2)+32768*(w[i-1]%2))%65536;
  39. if(w[i]<0)
  40. {
  41. w[i]=w[i]+65536;
  42. }
  43. }
  44. // 4 шаг
  45. for(i=1; i<=k+256; i++)
  46. {
  47. u[i]=w[i]^v[i];
  48. }
  49. // 5 шаг
  50. for(i=1; i<=k; i++)
  51. {
  52. y[i]=(u[i+256]+(u[i+255]/255))%256;
  53. if(y[i]<0)
  54. {
  55. y[i]=y[i]+256;
  56. }
  57. printf("%d\n", y[i]);
  58. }
  59. }
  60. void main()
  61. {
  62. int *t;
  63. int i, n=31, k=100;
  64. t=malloc(n*sizeof(int));
  65. for (i=1; i<=n; i++)
  66. {
  67. t[i]=i;
  68. }
  69.  
  70. random(k, t);
  71. }
Случайнве числа, полученные таким образом нужно использовать в следующем коде (здесь это y_massiv[j+e]):
Листинг программы
  1. sum=0;
  2. for(j=0; j=k_massiv[t]-1; j++)
  3. {
  4. y_massiv_summ[j]=y_massiv[j+e];
  5. sum+=y_massiv_summ[j];
  6. }
  7. M=sum%d_massiv[t];
  8. e=e+k_massiv[t];
и этот кусок кода может выполняться не один раз, т.е. значение

e

будет меняться, следовательно будет меняться индекс y_massiv[j+e]. Вопрос: Как сделать так, чтобы не вызывать постоянно функцию random с различным числом

k

? Т.е. если нужно 5 случ. чисел, а потом 7, а потом 48, как сделать так, чтобы считать не заново 7 чисел, а "дописывать", считать только 2 числа? Язык - строго Си. Без ++. Помогите, пожалуйста!

Решение задачи: «Сделать так, чтобы не вызывать постоянно функцию random с различным числом k»

textual
Листинг программы
  1. #include <iostream>
  2. unsigned int* Z;//массив со значениями для генератора случайных чисел
  3.  
  4. int Rand()
  5. {
  6.     static int Curr=0,Z31=0,Z21=9;//статические переменные для хранения состояния функции после каждого ее вызова
  7. //каждое следующее сгенирированное число Z[i]=Z[i-31]-Z[i-21]
  8. // Curr это индекс i,Z31- индекс i-31,Z21-индекс i-21
  9.     unsigned int result=Z[Curr]=static_cast<unsigned int>(Z[Z31]-Z[Z21])%65257;
  10. //чтобы не расширять массив, двигаемся по исходному циклически
  11.     Curr+=Curr==31?-31:1;
  12.     Z31+=Z31==31?-31:1;
  13.     Z21+=Z21==31?-31:1;
  14.     return result;
  15. }
  16. int main()
  17. {
  18.     Z=new unsigned int[31];
  19.     for(int i=0;i<31;Z[i]=i,i++);//инициализируем массив
  20.     for(int i=0;i<10000;i++)
  21.         std::cout<<Rand()<<'\n';
  22.     system("pause");
  23.     return 0;
  24. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы