Skip to content

Commit

Permalink
Merge pull request #177 from steve-h/randomwork
Browse files Browse the repository at this point in the history
Implement random function to be similar to Python random.uniform()
  • Loading branch information
davedelong committed Aug 28, 2020
2 parents 3342c56 + 6c8a9fb commit 6f5bd12
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 4 deletions.
16 changes: 12 additions & 4 deletions MathParser/Sources/MathParser/Functions+Defaults.swift
Expand Up @@ -179,15 +179,23 @@ extension Function {
let argValue = try state.evaluator.evaluate(arg, substitutions: state.substitutions) let argValue = try state.evaluator.evaluate(arg, substitutions: state.substitutions)
argValues.append(argValue) argValues.append(argValue)
} }

var lowerBound = 0.0
let lowerBound = argValues.count > 0 ? argValues[0] : Double.leastNormalMagnitude var upperBound = 1.0
let upperBound = argValues.count > 1 ? argValues[1] : Double.greatestFiniteMagnitude switch argValues.count {
case 1:
upperBound = argValues[0]
case 2:
lowerBound = argValues[0]
upperBound = argValues[1]
default:
break
}


guard lowerBound < upperBound else { throw MathParserError(kind: .invalidArguments, range: state.expressionRange) } guard lowerBound < upperBound else { throw MathParserError(kind: .invalidArguments, range: state.expressionRange) }


let range = upperBound - lowerBound let range = upperBound - lowerBound


return (drand48().truncatingRemainder(dividingBy: range)) + lowerBound return drand48() * range + lowerBound
}) })


public static let log = Function(name: "log", evaluator: { state throws -> Double in public static let log = Function(name: "log", evaluator: { state throws -> Double in
Expand Down
27 changes: 27 additions & 0 deletions MathParser/Tests/MathParserTests/GithubIssues.swift
Expand Up @@ -377,4 +377,31 @@ class GithubIssues: XCTestCase {
guard let d2 = XCTAssertNoThrows(try "-2++3".evaluate()) else { return } guard let d2 = XCTAssertNoThrows(try "-2++3".evaluate()) else { return }
XCTAssertEqual(d2, 1) XCTAssertEqual(d2, 1)
} }

func testIssue158() {
srand48(282828)
guard let d1 = XCTAssertNoThrows(try "random()".evaluate()) else { return }
XCTAssertLessThanOrEqual(d1, 0.4662)
XCTAssertGreaterThanOrEqual(0.4661, d1)

srand48(298298)
guard let d2 = XCTAssertNoThrows(try "random(100)".evaluate()) else { return }
XCTAssertLessThanOrEqual(d2, 75.79)
XCTAssertLessThanOrEqual(75.78, d2)

srand48(828282)
var total: Double = 0.0
for _ in 1..<10 {
guard let d3 = XCTAssertNoThrows(try "random(100,600)".evaluate()) else { return }
total += d3
}
XCTAssertGreaterThanOrEqual(total / 10, 270)
XCTAssertLessThanOrEqual(total / 10, 271)

srand48(400400)
guard let d4 = XCTAssertNoThrows(try "random(-10.0, 10.0)".evaluate()) else { return }
XCTAssertLessThanOrEqual(d4, -1.69)
XCTAssertLessThanOrEqual( -1.70, d4)

}
} }

0 comments on commit 6f5bd12

Please sign in to comment.