CodeInside
@CodeInside

Как получить случайное значение с двух диапазонов?

пишу функцию, которая получает символ с диапазона 'a'-'d' и возвращает любой другой символ с этого же диапазона.
char randomResponse(char correctAnswer)//принимает правильный вариант ответа, возвращает неверный
{
	srand ( time(NULL) );//сбросить "random"
	switch(correctAnswer)
	{
	case 'a': return (char)rand() %(int)'d' + (int)'b';//получение случайного символа с диапазона 'b'-'d'
	}
}

Как организовать для case 'b'?
  • Вопрос задан
  • 283 просмотра
Решения вопроса 1
@andrewjabber
Это решение подходит для любого диапазона, например
range[] = "asdfjkl";
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

char range[] = "abcd";
int rangeLen;

char randomResponse(char correctAnswer)//принимает правильный вариант ответа, возвращает неверный
{
	int r = rand() % (rangeLen-1);
	if (r >= correctAnswer)
		++r;
	return range[r];
}

int main()
{
	srand(time(0));
	rangeLen = strlen(range);
	// test
	for (int i = 0; i < rangeLen; i++)
		printf("%c ", randomResponse(range[i]));

	_getch();
	return 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
dima11221122
@dima11221122
Разработчик программного обеспечения
Мне кажется лучше так

#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

char randomeResponse(char a)
{
    int r = rand()%4;
    while(r == (a - 'a')) r = rand() % 4;
    return char(r + 'a');
}

int main()
{
    srand(time(NULL));
    cout << randomeResponse('b');
    return 0;
}
Ответ написан
magalex
@magalex
Архитектор распределённых систем управления
Попробуйте вот так:
char x = 'a' + (char)rand() % ( 'd' - 'a' );
if( x >= correctAnswer )
{
    x++;
}
return x;
Ответ написан
Комментировать
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int.hpp>

char randomResponse(const char correctAnswer) {
    static boost::random::mt19937 rng;
    static boost::random::uniform_int_distribution<char> uni('a', 'd');

    char result;

    while((result = uni(rng)) == correctAnswer);

    return result;
}


Для c++11:
#include <random>

char randomResponse(const char correctAnswer) {
    static std::mt19937 rng;
    static std::uniform_int_distribution<char> uni('a', 'd');

    char result;

    while((result = uni(rng)) == correctAnswer);

    return result;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы