Форум программистов, компьютерный форум CyberForum.ru

Баг в коде(псевдо-рандомные числа) - C++

Восстановить пароль Регистрация
 
leopolddj
0 / 0 / 0
Регистрация: 01.07.2013
Сообщений: 2
01.07.2013, 23:57     Баг в коде(псевдо-рандомные числа) #1
Здраствуйте, суть программы в том чтобы в цикле выдавало определенное количество рандомных значений элементом массива, например если 10 значений, то числа от 0 до 9 без повторений.
Иногда при запуске 1 элемент массива дает одинаковое значение другого элемента, причем етот баг происходит только с ним
Вот код:
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
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
    const int SIZE=10;
    srand(time(NULL));
    int mass[SIZE];
    for(int i=0;i<SIZE;i++)
    {
       mass[i]=rand()%10+0;
 
       for(int j=0;j<SIZE;j++)
        {   
           
           if(mass[i]==mass[j] && i!=j)
           {
                mass[i]=rand()%10+0;
                j=0;
           }
           else
           {
               continue;
           }
        }
       cout<<mass[i]<<"\t";
    }   
}
подозреваю что ошибка в
C++
1
j!=i
Помогите исправить, заранее спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2013, 23:57     Баг в коде(псевдо-рандомные числа)
Посмотрите здесь:

C++ Рандомные числа
сделать рандомные числа C++
C++ std::regex : баг на сайте или баг компилятора?
C++ Рандомные числа
C++ Рандомные числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shurikspk
 Аватар для shurikspk
396 / 217 / 34
Регистрация: 10.02.2013
Сообщений: 780
02.07.2013, 00:31     Баг в коде(псевдо-рандомные числа) #2
не знаю в чем проблема но у меня все верно работает
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 01:00     Баг в коде(псевдо-рандомные числа) #3
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
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
 
int main()
{
    const int SIZE = 10;
    srand(time(NULL));
    int mass[SIZE];
    int d;
    for(int i = 0; i < SIZE; i++)
    {
        d = rand() % 10;
        
        for(int j = 0; j < i; j++)
        {
          if (mass[j] == d) 
          {
               for ( ; mass[j] == d; )
                    d = rand() % 10;
                j = -1;
          }
        }
        mass[i] = d;
        
       cout << mass[i] << " ";
    }
    
    cout << endl;
    return 0;
}
Добавлено через 6 минут
leopolddj, в вашем варианте ошибка, скорее всего, здесь:
C++
1
j = 0;
Нужно:
C++
1
j = -1;
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
02.07.2013, 06:51     Баг в коде(псевдо-рандомные числа) #4
Нужно использовать цикл while и проводить столько итераций, сколько потребуется для генерации корректного значения. Представьте, что однажды рандом вам 1000 раз подряд сгенерирует неправильное число, а у на всю программу только 100 итераций (кстати, это только неправильно - зачем проверять совпадение со всеми элементами, когда мы генерируем только второй-третий, а в последующих еще мусор?)
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 <iostream>
#include <cstdlib>
#include <ctime>
 
bool IsMember(const int* arr, size_t sz, int x)
 {
 for (size_t i = 0; i < sz; ++i)
  if (x == arr[i])
   return true;
 return false;
 }
 
int main()
{
const size_t Size = 10;
int array[Size];
for (size_t i = 0; i < Size; ++i)
 {
 bool Ok = false;
 int a;
 while (! Ok)
  {
  Ok = true;
  a = rand() % Size;
  if (IsMember(array, i, a))
   Ok = false;
  }
 array[i] = a;
 std::cout << a << "\t";
 }
}
alsav22, при повторной генерации нужно заново сравнивать со всеми предыдущими элементами, не только с тем, с которым совпало сейчас. И желательно все-таки использовать while, когда число итераций заранее неизвестно. Хотя работать будет и так.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2013, 12:22     Баг в коде(псевдо-рандомные числа) #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
А почему бы не заполнить массив, сделать ему random_shuffle() и последовательно выбирать значения?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 16:21     Баг в коде(псевдо-рандомные числа) #6
Цитата Сообщение от Гром Посмотреть сообщение
alsav22, при повторной генерации нужно заново сравнивать со всеми предыдущими элементами, не только с тем, с которым совпало сейчас.
У меня так и сделано (да и у ТС): j = -1 и просмотр mass с начала, с новым значением d.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11816 / 6795 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
02.07.2013, 17:55     Баг в коде(псевдо-рандомные числа) #7
Гром, а теперь попробуйте сгенерировать RAND_MAX и более элементов
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
02.07.2013, 18:17     Баг в коде(псевдо-рандомные числа) #8
alsav22, действительно, не обратил внимания на эту строчку. Думаю, у такого варианта есть некоторые проблемы с читабельностью (при беглом просмотре легко не заметить этого принципиально важного перехода). Я все же предпочитаю более явное указание последовательности действий. Конечно, если дело не идет о суровой оптимизации.

Croessmah, упс!
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
03.07.2013, 01:47     Баг в коде(псевдо-рандомные числа) #9
Tulosba, Попробовал random_shuffle()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <algorithm>
#include <ctime>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    const int SIZE=10;
    srand(time(NULL));
    int mass[SIZE];
        for (int j=0; j<SIZE; j++)
            mass[j] = j+1;
        random_shuffle(mass, mass+SIZE);
        for (int j=0; j<SIZE; j++)
cout << mass[j] << " ";
 cout << " \n\n";
}
Работает

Добавлено через 6 минут
Наверное все таки правильней
C++
1
for (int j=0; j<SIZE; ++j)
Croessmah
03.07.2013, 01:49
  #10

Не по теме:

Работает
Tulosba плохого не посоветует

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2013, 02:48     Баг в коде(псевдо-рандомные числа)
Еще ссылки по теме:

Баг в коде (статическая структура) C++
C++ Не получается создавать рандомные числа
C++ Массив и рандомные числа

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

Или воспользуйтесь поиском по форуму:
Artimosha
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 12
03.07.2013, 02:48     Баг в коде(псевдо-рандомные числа) #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
25
26
27
28
29
30
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
    const int SIZE=15; // в массиве будут от 0 до 14, т.е. 15 разных значений
    srand(time(NULL));
    int mass[SIZE];
    mass[0]=rand()%SIZE; //для 1-го элемента массива
    cout<<mass[0]<<"\n";
    //цикл для остальных элементов массива(генерация,проверка и вывод)
    for(int i=1;i<SIZE;i++){
        int ok=0; //признак повторений
        int buf;
        while(!ok){
            buf=rand()%SIZE;
            ok=1;
            for(int j=0;j<i;j++){
                if (buf==mass[j]) {
                    ok=0;
                    break;
                }
            }
        }
        mass[i]=buf;
        cout<<mass[i]<<"\n";
    }
}
Может вам подойдет... набросал только что... =)
Yandex
Объявления
03.07.2013, 02:48     Баг в коде(псевдо-рандомные числа)
Ответ Создать тему
Опции темы

Текущее время: 00:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru