Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2019, 15:19   #1
BundesGott
 
Регистрация: 20.12.2018
Сообщений: 7
По умолчанию [С]Моделирование

Всем здравствуйте!
На заводе собирают прибор из трех блоков. Известно, что среди блоков первого типа встречаются 2% со скрытыми дефектами, среди блоков второго и третьего типа — соответственно 3% и 5% дефектных. С использованием генератора случайных чисел промоделировать сборку 1000 деталей и определить, сколько будет собрано приборов без брака.
---
Решая задачу столкнулся с проблемой:
сбор прибора без брака - означает,что на каждом из 3 этапов сборки брака не было. Но,поскольку массив не используется, я не могу понять, как нужно просуммировать количество таких деталей?И есть подозрения,что я неправильно моделирую сборку.
Заранее благодарю за указание на ошибку. Спасибо.
Код:
#include <iostream>
#include "stdafx.h"
#include <ctime>
#include <cstdlib>

int main()
{
	srand(time(NULL));
	const int size = 100;
	int N;
	bool flag;
	float ver[3];
	float temp;
	do
	{
		printf("Input amount detalis < %d ", size);
		scanf_s("%d", &N);
	} while (N <= 0 || N > size);
	for (int i = 1;i <= 3;i++)
	do
	{
		printf("Input the %i probability: ",i);
		scanf_s("%f", &ver[i]);
	} while (ver[i] <= 0 || ver[i] > 100);
	for (int i = 1; i <= N; i++)
	{
		flag = true;
		printf("\n%-3d", i);
		for (int j = 1; j <= 3; j++)
		{
			temp = (float)rand()*(100 - 1) / RAND_MAX + 1;
			if (temp <= ver[j])
			{
				flag = false;
			}
			printf("%-3d ", flag);
		}
	}
	getchar(), getchar();
    return 0;
}
BundesGott вне форума Ответить с цитированием
Старый 07.01.2019, 15:41   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

А зачем тут массив? Тем более для суммирования?

Код:
счетчик = 0
цикл на 1000 деталей
  флаг = тру
  сгенерить число, проферить на 2% - не прошло флаг = фолс
  сгенерить число, проферить на 3% - не прошло флаг = фолс
  сгенерить число, проферить на 5% - не прошло флаг = фолс
  если флаг, то инкрементировать счетчик
p51x вне форума Ответить с цитированием
Старый 07.01.2019, 16:13   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,708
По умолчанию

И неконкретная формулировка задачи: сборка 1000 деталей или 1000 блоков? Математика - не партсобрание, здесь формулировки д.быть точными.
digitalis вне форума Ответить с цитированием
Старый 07.01.2019, 16:16   #4
BundesGott
 
Регистрация: 20.12.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А зачем тут массив? Тем более для суммирования?

Код:
счетчик = 0
цикл на 1000 деталей
  флаг = тру
  сгенерить число, проферить на 2% - не прошло флаг = фолс
  сгенерить число, проферить на 3% - не прошло флаг = фолс
  сгенерить число, проферить на 5% - не прошло флаг = фолс
  если флаг, то инкрементировать счетчик
да,спасибо,почему то не подумал об этом.
а генерация верна ли? потому что получается почему то так,что если первое сгенерированное число больше чем первая вероятность, то второе и третье число гарантированно будут либо 0 0 ,либо 1 1
т.е почему то 0 1 0 или 0 1 1
или 1 0 1 примеров не встречается даже за неоднократное моделирование по 100 деталей
нормально ли это?
BundesGott вне форума Ответить с цитированием
Старый 07.01.2019, 16:16   #5
BundesGott
 
Регистрация: 20.12.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
И неконкретная формулировка задачи: сборка 1000 деталей или 1000 блоков? Математика - не партсобрание, здесь формулировки д.быть точными.
моделирование сборки 1000 деталей,состоящих из 3 блоков,конечно же
BundesGott вне форума Ответить с цитированием
Старый 07.01.2019, 16:25   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

1. У вас вроятность должна быть в пределах от 0%, а у вас от 1%
2. Массивы нумеруются с 0, а у вас выход за границы в
Код:
if (temp <= ver[j])
при j =3
p51x вне форума Ответить с цитированием
Старый 07.01.2019, 16:29   #7
BundesGott
 
Регистрация: 20.12.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. У вас вроятность должна быть в пределах от 0%, а у вас от 1%
2. Массивы нумеруются с 0, а у вас выход за границы в
Код:
if (temp <= ver[j])
при j =3
выход за границы поправил, но та же ситуация осталась:
первый столбец абсолютно весь забит 1, не смотря на то,что я сравниваю вероятность с 99%,например
BundesGott вне форума Ответить с цитированием
Старый 07.01.2019, 17:23   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Выкладывайте исправленный код. Все генерится https://ideone.com/Yp9Lht
p51x вне форума Ответить с цитированием
Старый 07.01.2019, 17:28   #9
BundesGott
 
Регистрация: 20.12.2018
Сообщений: 7
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Выкладывайте исправленный код. Все генерится https://ideone.com/Yp9Lht
Код:
#include <iostream>
#include "stdafx.h"
#include <ctime>
#include <cstdlib>


int main()
{
	srand(time(NULL));
	const int size = 1000;
	int N;
	bool flag;
	float ver[3];
	float temp;
	int score = 0;
	do
	{
		printf("Input amount detalis < %d ", size);
		scanf_s("%d", &N);
	} while (N <= 0 || N > size);
	for (int i = 0;i < 3;i++)
	do
	{
		printf("Input the %i probability: ",i);
		scanf_s("%f", &ver[i]);
	} while (ver[i] <= 0 || ver[i] > 100);
	for (int i = 0; i < N; i++)
	{
		flag = true;
		printf("\n%-5d", i+1);
		for (int j = 0; j < 3; j++)
		{
			temp = (float)rand()*100 / RAND_MAX;
			if (temp <= ver[j])
			{
				flag = false;
			}
			printf("%-3d ", flag);
		}
		if (flag) score++;
	}
	printf("\nScore = %d", score);
	getchar(), getchar();
    return 0;
}
Если взять ver[0] = 99,то первые столбцы будут 0,это хорошо
но если при этом брать ver[1] и ver[2] даже по 1, то за 999 деталей в 2 и 3 столбце единица появляется пару раз

Последний раз редактировалось BundesGott; 07.01.2019 в 17:37. Причина: поправил код
BundesGott вне форума Ответить с цитированием
Старый 07.01.2019, 17:39   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

100 / RAND_MAX = 0 всегда, как целое/целое. Вы в моем примере точку не заметили?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компьютерное моделирование, моделирование физических процессов. (в Excel ) Dytchi Помощь студентам 0 06.02.2012 15:54
Моделирование Antistas Паскаль, Turbo Pascal, PascalABC.NET 4 05.11.2011 11:22
моделирование voron.kz Помощь студентам 0 15.12.2009 02:07