5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
1

Генерация массива случайных чисел код выдаёт неправильный результат

13.12.2017, 21:48. Показов 1084. Ответов 23
Метки нет (Все метки)

Вот код :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(){
int n, q, j, x, r, z, w , s, i = 0;
int y[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
printf("Vvedite n = ");
scanf("%i", &n);
while(r <= n) {
j = 0; r = 0;      
srand(time(NULL)); 
s = floor(rand()/rand());
if((s > 0) && (s <= n)) {
 for(x = 0; x < 10; x++) {if(s != y[x]) {++j;}}}  
  if(j == 10) {y[i] = s; ++i;}
 for(z = 0; z < 10; z++) {if(y[z] != 0) {++r;}} 
   }
 for(w = 0; w < r; w++) {printf("%i", y[w]);}
 getchar();
}
По идеи он должен создавать массив чисел от 1 до n (не > 10), без нулей, без повторов, без исключений,
вобщем смотри ветку CLIPS...
Пока меня интересует, происходит ли сравнивание r с n ...
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2017, 21:48
Ответы с готовыми решениями:

Генератор случайных чисел выдаёт некорректный результат
Необходимо, заполнить массив случайными числами из предела , но вместо этого результат выполнения...

Программа с генератором случайных чисел не всегда выдает корректный результат
Небольшой &quot;шедевр&quot;. Вроде бы синтаксис верный, а вот работает периодически с ошибками. Как вы...

Генерация массива случайных чисел
Начал свое знакомство с haskell, но наступил ступор, когда понадобилось решить задачу, для которой...

Генерация массива случайных чисел
помогите пожалуйста ! нужно написать функцию которая будет генирировать числа от 1 до 60 и...

23
Модератор
Эксперт по электронике
8695 / 6493 / 879
Регистрация: 14.02.2011
Сообщений: 22,714
13.12.2017, 23:52 2
Цитата Сообщение от Slenon Посмотреть сообщение
srand(time(NULL));
s = floor(rand()/rand());
зачем каждый раз настраивать генератор?

Добавлено через 2 минуты
Цитата Сообщение от Slenon Посмотреть сообщение
while(r <= n)
r здесь чему равно?
0
298 / 207 / 174
Регистрация: 11.05.2016
Сообщений: 655
14.12.2017, 00:10 3
Цитата Сообщение от Slenon Посмотреть сообщение
rand()/rand()
иногда можно и на ноль делить)
0
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
18.12.2017, 18:46  [ТС] 4
Цитата Сообщение от ValeryS Посмотреть сообщение
r здесь чему равно?
ValeryS, r должно быть равно числу элементов (не нулей), получаемых в результате
работы проги ( при n = 5, y[], например, = 3, 2, 4, 5, 1, 0, 0, 0, 0, 0) ...
Вот исправленный кусок кода:
C
1
2
3
4
5
6
7
8
9
10
11
int y[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//-------------------------------------------------
srand(time(NULL));
printf("Vvedite n = ");
scanf("%i", &n);
while(r < n) {
j = 0; r = 0;
s1 = rand(); s2 = rand();
if((s1 > 0) && (s2 > 0)) {s = floor(s1/s2);}
//---------------------------------------------------
if(s <= n) {for(x = 0; x < 10; x++) {if(s != y[x]) {++j;}}}
0
Модератор
Эксперт по электронике
8695 / 6493 / 879
Регистрация: 14.02.2011
Сообщений: 22,714
18.12.2017, 18:56 5
Цитата Сообщение от Slenon Посмотреть сообщение
r должно быть равно числу элементов
и где это в коде?
0
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
19.12.2017, 02:12  [ТС] 6
C
1
for(z = 0; z < 10; z++) {if(y[z] != 0) {++r;}}
Должна происходить проверка всех (10) элементов массива
на неравенство 0, если y[z] != 0, происходит приращение r ...
0
Модератор
Эксперт по электронике
8695 / 6493 / 879
Регистрация: 14.02.2011
Сообщений: 22,714
19.12.2017, 07:57 7
еще раз, где в коде r присваивается значение?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
19.12.2017, 08:05 8
Цитата Сообщение от ValeryS Посмотреть сообщение
еще раз, где в коде r присваивается значение?
у него 0 постоянно присваивать к r в цыкле
C++
1
r = 0;
0
Модератор
Эксперт по электронике
8695 / 6493 / 879
Регистрация: 14.02.2011
Сообщений: 22,714
19.12.2017, 08:07 9
Цитата Сообщение от Antikl Посмотреть сообщение
у него 0 постоянно присваивать к r в цыкле
а строчку выше видел?
Цитата Сообщение от Slenon Посмотреть сообщение
C
1
while(r < n)
вот я про неё и спрашиваю
0
2641 / 2218 / 238
Регистрация: 03.07.2012
Сообщений: 8,047
Записей в блоге: 1
19.12.2017, 08:52 10
Как программа написана, так и работает. По поводу [не]правильности - все претензии к автору кода.
0
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
19.12.2017, 21:17  [ТС] 11
Заработало!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(){
int n, q, j, x, z, w , s, s1, s2;
int i = 0; int r = 0;
int y[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
srand(time(NULL));
printf("Vvedite n = ");
scanf("%i", &n);
while(r < n) {
j = 0; r = 0;
s1 = rand(); s2 = rand();
if((s1 > 0) && (s2 > 0)) {s = floor(s1/s2);}
if(s <= n) {for(x = 0; x < 10; x++) {if(s != y[x]) {++j;}}}  
if(j == 10) {y[i] = s; ++i;}
 for(z = 0; z < n; z++) {if(y[z] != 0) {++r;}} 
   }
 for(w = 0; w < n; w++) {printf("%i", y[w]);}
 getchar();
}
Спасибо за настойчивый ? ...

Добавлено через 32 минуты
Изменим вывод:
C
1
2
printf("%s", " S = ");
 for(w = 0; w < n; w++) {printf(" %i ", y[w]);}
0
Модератор
Эксперт по электронике
8695 / 6493 / 879
Регистрация: 14.02.2011
Сообщений: 22,714
19.12.2017, 21:32 12
Цитата Сообщение от Slenon Посмотреть сообщение
Заработало!
ну и хорошо
а теперь другое решение
забивает массив из 9 элементов числами от 1 до 9
C++
1
2
3
4
5
6
7
8
9
10
11
int arr[9];
int boolArr[10]={0};
for(int i=0;i<9;i++)
{
 int RandTmp=0;
 do{
    RandTmp=rand()%9+1
   }while(boolArr[RandTmp]!=0);
 boolArr[RandTmp]=1;
 arr[i]=RandTmp;
}
0
С чаем беда...
Эксперт CЭксперт С++
9988 / 5341 / 1460
Регистрация: 18.10.2014
Сообщений: 12,836
19.12.2017, 21:35 13
Нет, не заработало.

Цитата Сообщение от Slenon Посмотреть сообщение
C++
1
2
s1 = rand(); s2 = rand();
if((s1 > 0) && (s2 > 0)) {s = floor(s1/s2);}
Ну а чему будет равно s если и s1, и s2 окажутся равны 0?
0
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
19.12.2017, 22:13  [ТС] 14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ну а чему будет равно s если и s1, и s2 окажутся равны 0?
C
1
if((s1 > 0) && (s2 > 0)) {s = floor(s1/s2);} else {s = 0;}
и ещё дополнение, что бы окно не схлопывалось:
C
1
2
getchar();
getchar();
0
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
11.02.2018, 03:21  [ТС] 15
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
int main(){
int n, q, j, x, z, w , s, s1, s2, r, i;
srand(time(NULL));
while(2) {
printf("Vvedite n = ");
scanf("%i", &n);
if(n == 0) {break;}
printf("\n");
i = 0; r = 0;
int y[850]={0};
while(r < n) {
j = 0; r = 0;
s1 = rand(); s2 = rand();
if((s1 > 0) && (s2 > 0)) {s = floor(s1/s2);} else {s = 0;}
if(s <= n) {for(x = 0; x < 850; x++) {if(s != y[x]) {++j;}}}  
if(j == 850) {y[i] = s; ++i;}
 for(z = 0; z < n; z++) {if(y[z] != 0) {++r;}} 
      }
printf("%s", " S =");
for(w = 0; w < n; w++) {printf(" %i", y[w]);}
printf("\n\n");
   }
}
0
Модератор
Эксперт С++
12080 / 9759 / 5902
Регистрация: 18.12.2011
Сообщений: 26,196
11.02.2018, 11:51 16
Цитата Сообщение от Slenon Посмотреть сообщение
floor(s1/s2)
s1 и s2 целые числа в диапазоне [0, RAND_MAX]
Результат деления - целое число в диапазоне [1, RAND_MAX]
причем равномерность распределения при таком делении сильно искажена,
маленькие значения будут встречаться гораздо чаще, чем большие
(плотность распределения будет иметь вид 1/x).

И зачем это Вам, когда в помощи по rand приведен пример, как это делать правильно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void RangedRandDemo( int range_min, int range_max, int n )
{
   // Generate random numbers in the half-closed interval
   // [range_min, range_max). In other words,
   // range_min <= random number < range_max
   int i;
   for ( i = 0; i < n; i++ )
   {
      int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)
            + range_min;
      printf( "  %6d\n", u);
   }
}
Привел Ваш код в божеский вид:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <time.h>
//#include <iostream>
//#include <cstring>
#include <stdlib.h>
//#include <cmath>
//using namespace std;
int RangedRand( int range_min, int range_max)
{
   // Generate random numbers in the half-closed interval
   // [range_min, range_max). In other words,
   // range_min <= random number < range_max
      int u = int((double)rand() / (RAND_MAX + 1) * (range_max - range_min))
            + range_min;
      return u;
}
int main(){
    int n, j, is, i;
    const int MAX_SIZE=850;
    int y[MAX_SIZE];
    srand((unsigned)time(NULL));
    while(1) 
    {
        printf("Enter n: ");
        scanf("%i", &n);
        if(n <= 0 || n > MAX_SIZE)
            break;
        puts("");
        i = 0;
        for(j = 0; j < n; j++)
            y[j]=0;
        while(i < n) 
        {
            is = RangedRand(1,n+1);
            for(j = 0; j < n; j++) 
            {
                if(is == y[j])
                    break;
            }
            if(j == n) 
                y[i++] = is;
        }
        printf(" S =");
        for(j = 0; j < n; j++) 
            printf(" %i", y[j]);
        puts("\n");
    }
    return 0;
}
Но на С++ это можно сделать гораздо красивее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    const int MAX_SIZE=850;
    int y[MAX_SIZE];
    while(true) 
    {
        cout<<"Enter n: ";
        int n;
        cin>>n;
        if(n <= 0 || n > MAX_SIZE)
            break;
        cout<<endl;
        for(int j = 0; j < n; j++)
            y[j]=j+1;
        random_shuffle(y,y+n);
        cout<<" S =";
        for(int j = 0; j < n; j++) 
            cout<<y[j]<<' ';
        cout<<endl;
    }
    return 0;
}
0
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
03.11.2018, 04:26  [ТС] 17
Просьба объяснить что в коде неправильно ...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
void RangedRandDemo(int n ) {
   int i;
   for ( i = 0; i < n; i++ ) {
   int u = (double)rand() / (RAND_MAX + 1) * (n - 1) + 1;
   printf( " %d", u);
   }
}
using namespace std;
int main(){
int n;
while(1) {
printf(" Vvedite n = ");
scanf("%i", &n);
printf("%s", "         S =");
RangedRandDemo(n);
printf("\n");
   }
}
Добавлено через 16 минут
Мне надо, чтобы прога выдавала примерно следующее:
Vvedite n = 7
S = 3 5 6 2 1 7 4
Vvedite n = 7
S = 4 7 2 6 1 5 3

...........................
0
552 / 530 / 85
Регистрация: 29.05.2015
Сообщений: 3,446
03.11.2018, 08:14 18
Самому подумать не пробовал?
0
5 / 5 / 3
Регистрация: 25.07.2016
Сообщений: 182
03.11.2018, 18:04  [ТС] 19
Вот что я напридумывал (всё равно ... )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <list>
#include <cmath>
using namespace std;
 
void spisok(int n) {
    list<int> Spisok(0);
     while(Spisok.size() <= n) {
         int J = 0, T = round((double)rand() * n);
          if(T != 0) {
           list<int>::iterator p = Spisok.begin();
            while(p != Spisok.end()) {
                if(*p != T) {++J;}
         }
      }
                 if(J == Spisok.size()) {printf(" %d", T); Spisok.push_back(T);}
   }
}
int main() {
int n;
srand(time(NULL));
while(1) {
printf(" Vvedite n = ");
scanf("%i", &n);
printf("%s", "    Spisok =");
printf("\n");
   }
}
0
С чаем беда...
Эксперт CЭксперт С++
9988 / 5341 / 1460
Регистрация: 18.10.2014
Сообщений: 12,836
03.11.2018, 18:12 20
Цитата Сообщение от Slenon Посмотреть сообщение
Вот что я напридумывал (всё равно ... )
Тема генерации неповторяющихся случайных чисел уже миллион раз обсуждалась.

Непонятно только, зачем вы писали эту функцию spisok, если она у вас в программе ни разу не вызывается.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2018, 18:12
Помогаю со студенческими работами здесь

Генерация массива случайных неповторяющихся чисел
Нужно сгенирировать массив случайных чисел. Предположим что массив размером 10000, а диапазон...

Генерация массива случайных чисел равномерно распределенных в заданном интервале и упорядочение массива
Помогите создать ПО (на любом языке программирования) позволяющее, генерирующее массив заданной...

Генерация значений массива с помощью датчика случайных чисел
Задание: Разработать программу для обработки массива, обеспечив выполнение следующих операций: 1...

Генерация массива целых случайных чисел, которые не повторяются
Нужно получить числа от 0 до 15 в рандомном порядке, делаю так: BOOL...

Генерация массива целых случайных чисел, которые не повторяются
Случайные числа. Генерация случайного целого числа в заданном диапазоне. Генерация массива целых...

Выдает неправильный результат С++
Задание Найти среднее арифметическое действительных корней трёх квадратных уравнений. #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru