Используйте это, Rx генерирует серию случайных чисел от 0 до 99.

var R = new Random();
var ints = Observable.Interval(TimeSpan.FromSeconds(1));
var RandomNos = ints.Select(i=> R.Next(100)); // was new Random().Next(100) 
RandomNos.Subscribe(r=> Console.Write(r+ ","));

1,75,49,23,97,71,45,19,93,66,40,14,88,62,36,10,84

Я хочу захватить / обнаружить, когда я получаю 6 более чем 50 чисел подряд. Может ли Rx это сделать?

RandomNos.?????()
.Subscribe(l=> Console.WriteLine ("You got 6 more-than-50 numbers in a row"));
2
Rm558 2 Мар 2015 в 19:03

2 ответа

Лучший ответ

Один из способов сделать это - использовать {{X0} } метод.

var random = new Random();
var result = Observable.Interval(TimeSpan.FromSeconds(1))
    .Select(i => random.Next(100))
    .Buffer(6, 1)
    .Where(buffer => buffer.All(n => n > 50))

Если вместо 6-в-ряду вы пытались обнаружить K-в-ряду, где K было действительно очень большим, тогда вы, вероятно, захотели бы что-то сделать, используя вместо этого Window , но поскольку здесь K = 6, проще всего просто сделать то, что я предложил.

Кроме того, имейте в виду, что вероятность того, что число, равномерно выпадающее из {0, 1, ..., 99}, больше 50, составляет 49/100, а не 1/2.

4
Timothy Shields 2 Мар 2015 в 16:22

Просто для удовольствия, вот тот, который использует только один счетчик для любого «n» в строке - он ведет текущий счетчик чисел больше 50 - Take(1) завершает поток при первом появлении.

RandomNos.Scan(0, (a,x) => x > 50 ? ++a : 0)
         .Where(x => x == 6)
         .Take(1)
         .Subscribe(_ => Console.WriteLine("You got 6 more-than-50 numbers in a row"));
2
James World 2 Мар 2015 в 20:25